Python: Zugriff auf externe Prozessinformationen

8

Ich versuche herauszufinden, wie man mit Python managen kann, obwohl vielleicht C ++ dafür besser sein könnte. Ich benutze Python 2.7 und Ubuntu 14.04 ist mein Betriebssystem.

Resume von dem, was ich erreichen möchte:

  • Sende Aktionen (keine Signale) an einen laufenden Prozess // Interagiere mit der Benutzeroberfläche eines Prozesses
  • Speicheradressenwert lesen

Meine Absicht ist es, ein Skript zu erstellen, um andere Software zu verwalten, etwas, das dem ähnelt, was Selenium mit den Browsern macht, aber mit jedem Programm. Vielleicht führen Sie den Prozess mit Python mit Unterprozess würde mir die Option zur Verwaltung der Prozess UI geben

Aktionen senden / Mit laufendem Prozess interagieren

Im Moment mache ich dieses Skript in Linux mit psutil . Ich weiß, dass es einige Windows-Bibliotheken wie pywin oder pywindll gibt.

Ich möchte einen Prozess verwalten, zum Beispiel jede Art von Software mit UI (Skype, Gedit, Firefox ..), ich würde gerne wissen, ob es möglich ist, eine Aktion zu senden, um einen Klick in eine Schaltfläche zu machen.

Ich möchte die Maus nicht im Computer verwalten, denn sagen wir, das Fenster ist unter anderen Fenstern / Sachen versteckt:

  • Ist es möglich, wenn ich den Prozess in meinem Skript habe, um einen Klick auf eine Schaltfläche der Benutzeroberfläche zu senden? (oder schreibe in ein Textfeld)

Ich verwende psutil , um den Prozess zu erhalten, und ich habe viele Optionen wie:

  • Holen Sie sich die Speicherzuordnung
  • Erhalte die Threads des Prozesses
  • Töte den Prozess
  • CPU-Auslastung
  • usw.

Aber keine dieser Aktionen scheint das zu sein, wonach ich suche, nämlich mit der Prozess-UI zu interagieren ...

  • Ist sogar möglich, was ich erreichen möchte?

  • Wäre die einfachste Lösung, um Schlüsselstriche und Mausklicks zu senden?

Speicheradressenwert lesen

Ich habe scanmem in Linux verwendet, um die Speicheradresse einer Variablen zu finden, und sobald ich die Speicheradresse gefunden habe, nach der ich suche, möchte ich diese Adresse in Python verwenden, um den gespeicherten Wert zu erhalten in dieser Adresse.

Das nächste, was ich gefunden habe, war ctypes , etwas wie:

%Vor%
  • Ist dies der einfachste Weg, um auf eine Speicheradresse in Python zuzugreifen?
  • Kann diese Nummer in Echtzeit geändert / aktualisiert werden?
  • Wie kann ich die Speicheradresse mit IU identifizieren?

Ich dachte, dass ein Programm, wenn es ausgeführt wird, die Benutzeroberfläche des Programms an das Betriebssystem senden muss, könnte "capturen" die Schnittstelle mit Python und umleiten an das Betriebssystem?

So wie die Ausführung der Software über Python ist es möglich, die Benutzeroberfläche direkt zu verwalten

    
AlvaroAV 11.09.2014, 09:20
quelle

2 Antworten

2

Ich mag die Art, wie Sie denken: D UI-Automatisierung ist großartig

Soweit ich das beurteilen kann, basiert die gesamte Software, die mit der GUI von Prozessen interagieren kann, auf Computer Vision mit OCR oder Lesen des Speichers, um das Objektmodell der Benutzeroberfläche zu erhalten. Letzteres ist wahrscheinlich nicht universell, da verschiedene Widget-Toolkits und Ansätze zum Erstellen der UI unterschiedliche zugrunde liegende Modelle haben werden - es wird wahrscheinlich mehr Ärger bereiten als CV + OCR.

Wenn Sie etwas sehen möchten, das bereits für diesen Zweck erstellt wurde, lesen Sie die Wikipedieliste . Sie kennen Selenium bereits, aber es gibt noch mehr - AutoIt und Sikuli, wo ich nach einem ähnlichen Projekt gesucht habe, das ich in Python machen möchte. (AutoIt ist BASIC-like - YUCK - und Windows-only, aber Sikuli scheint mit Python verwandt zu sein und ist plattformübergreifend - ich habe sie schon vor Ewigkeiten überprüft, so dass ich mich nicht mehr an Details erinnere).

Die wirklich gute Nachricht ist, dass Python ziemlich gute CV- und OCR-Module hat. Meine persönliche Empfehlung ist simplecv , die opencv und andere cv Software umschließen kann und obwohl ich kein Modul von habe Auswahl für OCR empfohlen, python-tesseract am besten, wenn ich nach Modulen gesucht habe.

>

Der Ansatz ist im Allgemeinen, einen Schnappschuss der GUI zu machen (graphicsmagick kann das sehr gut und es gibt einen Python-Wrapper dafür), herausfinden, wo die Elemente mit CV sind, die Beschriftungen mit OCR lesen und auf diese Weise ein Modell für das, was auf dem Fenster ist. Dann geben Sie Ihrem Skript Anweisungen dazu, was wann zu tun ist, je nachdem, wo es sich auf der Benutzeroberfläche befindet. Da Python Maus- und Tastaturereignisse senden kann, sind Sie golden. Sie können sogar das Modul minidom verwenden, um ein einfacheres Objektmodell für Ihren Code zu erstellen.

Nebenbei wird der CV + OCR-Ansatz auch von einer Hearthstone-ähnlichen App verwendet, die Schnappschüsse vom Spiel erstellt und die Punktzahl liest, die sie dann für den Spieler verfolgt, damit sie Metriken erstellen können. Es ist eine leichtere und einfachere Herangehensweise als es scheint - ich habe den Code ausgecheckt und er war trotz der schwergewichtigen Technologien ziemlich einfach zu verstehen.

    
mechalynx 11.09.2014 10:23
quelle
0

Ich denke, ich habe eine Lösung, um eine Variable aus einem Programm in einem anderen Prozess zu lesen. Okay, um die Dinge ein wenig zu vereinfachen, sagen wir zum Beispiel, dass Sie versuchen, eine Kommunikation zwischen zwei verschiedenen in C ++ geschriebenen Programmen zu erstellen, sagen wir Programm A und Programm B. In Bezug auf Ihre Frage hätten wir einen Fall, in dem Programm 'A' versucht um auf den Wert einer Variablen im Programm 'B' zuzugreifen.

In diesem Fall dachte ich, dass Sie Boost Interprocess-Kommunikation verwenden könnten. Boost Interprocess ist also eine Bibliothek in Boost, die es Ihnen ermöglicht, zwischen zwei Prozessen mit Shared Memory zu kommunizieren. Sie können Nachrichtenwarteschlangen aus der Bibliothek verwenden. Weitere Informationen hierzu finden Sie hier:

Ссылка

Um auf das Beispiel zurückzukommen, müssen Sie einen Code schreiben, um das Lesen und Schreiben von Variablen zwischen Prozessen zu unterstützen. Nehmen wir an, wir können Arrays und skalare Werte nur lesen und schreiben. Sie müssen also eine Datenstruktur (vorzugsweise eine Karte) pflegen, die Namen von Variablen einem Speicherort im Speicher zuordnet. Etwas wie das:

%Vor%

Ich hoffe also, Sie sehen, was ich hier versuchen möchte, daher wird diese Art von Code in unserem Fall in Programm B existieren. Der Grund dafür ist, dass Programm A Befehle an Programm B senden kann, indem er sagt, ich möchte lese eine Variable namens "my_var".

So kommt jetzt der Teil der tatsächlichen Kommunikation. In Boost Interprocess können Sie Strukturen packen, die Befehle wie folgt lesen können:

%Vor%

Bitte lesen Sie die Dokumentation in Boost, um zu erfahren, wie man Shared-Memory-Instanzen einrichtet, denn nach der Einrichtung können Sie dann Befehle wie folgt senden:

%Vor%

Wenn Sie wieder zu Programm B gehen, können Sie Code wie diesen haben, um die Nachricht zu erhalten:

%Vor%

Sobald Sie das getan haben, können Sie Python mit Boost python library integrieren. Hoffe, das macht Sinn. Probieren Sie es aus und lassen Sie es mich wissen, wenn Sie Probleme haben. Dies ist keine exakte Implementierung, sondern eine Idee, die eine Lösung für Ihr Lesewertproblem bieten könnte.

Was das Problem der sendenden Aktionen betrifft, bin ich mir nicht sicher, wie ich mit der Benutzeroberfläche in einem anderen Prozess interagieren soll. Im Allgemeinen stellt der Hersteller dem Programmierer die API zur Verfügung, die für die Interaktion mit UI-Elementen verwendet wird. Was darunter passiert, ist sehr schwer zu verstehen und zu manipulieren, da es sich in den meisten Fällen um geschlossene Quellen handelt. Wenn Sie Zugriff auf den Quellcode in der API haben, wäre das ein anderer Fall. Sie könnten dann ähnliche Konzepte wie oben erwähnt verwenden, um an einen Speicherort in einem anderen Programm zu schreiben, der Ereignisse auslöst, die in der Benutzeroberfläche auftreten.

    
Farhan Rahman 11.09.2014 10:12
quelle