Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
ich möchte das python mitniterm (Terminal) benutzen und dann per pywinauto einen Tastendruck schicken. Ich benutze für den Start des Terminals folgenden Code:
import pywinauto
from pywinauto import application
from pywinauto.application import Application
# add your exe name here; you can get via Task Manager
yourExeName = "conhost.exe"
# get PID of your running process
pid = application.process_from_module(module = yourExeName)
print(pid)
# use Pid to connect
app = Application(backend='uia').connect(process = pid)
print(app)
pywinauto.keyboard.send_keys('^N')
Für das starten benutze ich <F5> wodurch sich die IDLE öffnet und dann auch im IDLE ein neues File öffnet. Dies ist das Problem, dass der Tastendruck im IDLE ausgeführt wird und nicht im miniterm. Ich habe die PID des miniterm geprüft und stimmt überein.
@MyPy17: conhost.exe ist auch in der Regel mehrdeutig, denn so einen Prozess starten ja alle Programme die entweder direkt eine Konsole verwenden oder zumindest ein „Pseudoterminal“ um mit einem anderen Prozess zu kommunizieren. Es wäre also deutlich robuster nicht in einem eigenen Programm ein externes Programm zu starten und dann in einem anderen eigenen Code nicht gezielt auf diesen Prozess zuzugreifen, sondern einfach allgemein irgendeinen conhost.exe-Prozess ansprechen zu wollen. Zumal conhost.exe auch nicht direkt die GUI-Anwendung sein dürfte — da muss kein Fenster zugeordnet sein.
Und dann ist das externe Programm auch noch ein Python-Programm. Da würde ich erst mal versuchen ob man da nicht direkt von Python aus mit dem Python-Modul beziehungsweise mit der `Miniterm`-Klasse arbeiten kann.
“Ich bin für die Todesstrafe. Wer schreckliche Dinge getan hat, muss eine angemessene Strafe bekommen. So lernt er seine Lektion für das nächste Mal.” — Britney Spears, Interview in der französischen Zeitung Libération, 2. April 2002
Sirius3 hat geschrieben: Dienstag 25. April 2023, 10:45
Um in einem Python-Programm etwas zu automatisieren braucht man kein pywinauto.
Was ist Dein eigentliches Problem? Was möchtest Du erreichen?
Nun, ich möchte das miniterm starten (erstes Pythonscript) und dann von einer anderen Applikation einen Tastendruck an das miniterm senden mit dem Aufruf des zweiten Pythonscripts. Ich meine dass dies mit pywinauto am einfachsten zu lösen ist, da das miniterm nur Tasteninputs verwendet.
Aber warum brauchst Du zwei Pythonscripts?
Was möchtest Du eigentlich erreichen? Ich frage nicht nach Deinem Lösungsweg. Sondern nach Deinem eigentlichen Problem, das Du hast.
__blackjack__ hat geschrieben: Dienstag 25. April 2023, 10:57
@MyPy17: conhost.exe ist auch in der Regel mehrdeutig, denn so einen Prozess starten ja alle Programme die entweder direkt eine Konsole verwenden oder zumindest ein „Pseudoterminal“ um mit einem anderen Prozess zu kommunizieren. Es wäre also deutlich robuster nicht in einem eigenen Programm ein externes Programm zu starten und dann in einem anderen eigenen Code nicht gezielt auf diesen Prozess zuzugreifen, sondern einfach allgemein irgendeinen conhost.exe-Prozess ansprechen zu wollen. Zumal conhost.exe auch nicht direkt die GUI-Anwendung sein dürfte — da muss kein Fenster zugeordnet sein.
Und dann ist das externe Programm auch noch ein Python-Programm. Da würde ich erst mal versuchen ob man da nicht direkt von Python aus mit dem Python-Modul beziehungsweise mit der `Miniterm`-Klasse arbeiten kann.
Nun es ist so, dass das Terminal (miniterm) gestartet ist und erst danach angesprochen wird von einem anderen pythonscript. Das heisst, man öffnet zuerst den Port x im miniterm und toggelt dann zu irgendeinem Zeitpunkt von einem anderen pythonskript die RTS-Leitung zum Beispiel. Im miniterm kann man dies erreichen wenn man eben eine Tastenkombination schickt.
Auch wenn ich die Klasse vom miniterm hätte wäre der Ablauf der gleiche, dass der Aufruf später von einer anderen Stelle aus kommt.
@MyPy17: Du hättest nicht die Klasse von Miniterm, sondern Du hast die, denn Du hast ja das `serial`-Package. Da ist die drin. Es wäre sinnvoller und robuster von `Miniterm` auszugehen und das zu erweitern als so eine nicht wirklich robuste Frickellösung umzusetzen.
Was heisst der Aufruf kommt von einer anderen Stelle aus? Warum ist das nicht das gleiche Programm? Und warum muss das so umständlich über simulierte Tastendrücke gehen? Die RTS-Leitung kann man ja auch direkt auf dem Serial-Objekt toggeln, und falls das tatsächlich aus einem anderen Prozess passieren muss, auch über eine RPC-Schnittstelle die man genau dafür anbietet.
“Ich bin für die Todesstrafe. Wer schreckliche Dinge getan hat, muss eine angemessene Strafe bekommen. So lernt er seine Lektion für das nächste Mal.” — Britney Spears, Interview in der französischen Zeitung Libération, 2. April 2002
Sirius3 hat geschrieben: Dienstag 25. April 2023, 14:46
Aber warum brauchst Du zwei Pythonscripts?
Was möchtest Du eigentlich erreichen? Ich frage nicht nach Deinem Lösungsweg. Sondern nach Deinem eigentlichen Problem, das Du hast.
Mit dem ersten wird ja nur das miniterm gestartet, sodass ich eigentlich nur das zweite script benötige um den Tastendruck zu senden. Angenommen das miniterm läuft schon, dann benötige ich nur noch das zweite Skript, das stimmt. Mein Problem ist wie gesagt: "Wie kann ich den Tastendruck an das miniterm senden, wenn das miniterm schon läuft u.U. im Hintergrund"?
Das ist immer noch nicht die Antwort auf die Frage. Du hast dir einen kruden Lösungsweg ausgedacht, der übermäßig kompliziert und daher schwer zu handhaben ist. Beschreibe das ursprüngliche Problem. NICHT was du dir schon als vermeintliche Lösung ausgedacht hast.
Wir waren doch schon hier viewtopic.php?t=56767 auf einen simplen Service gekommen? Ist das immer noch das gleiche Problem? Wieso kommt da plötzlich ein miniterm ins Spiel, und Tastendrücke statt simpler HTTP-Aufrufe?
__blackjack__ hat geschrieben: Dienstag 25. April 2023, 15:13
@MyPy17: Du hättest nicht die Klasse von Miniterm, sondern Du hast die, denn Du hast ja das `serial`-Package. Da ist die drin. Es wäre sinnvoller und robuster von `Miniterm` auszugehen und das zu erweitern als so eine nicht wirklich robuste Frickellösung umzusetzen.
Was heisst der Aufruf kommt von einer anderen Stelle aus? Warum ist das nicht das gleiche Programm? Und warum muss das so umständlich über simulierte Tastendrücke gehen? Die RTS-Leitung kann man ja auch direkt auf dem Serial-Objekt toggeln, und falls das tatsächlich aus einem anderen Prozess passieren muss, auch über eine RPC-Schnittstelle die man genau dafür anbietet.
Nun, der Aufruf kommt von einem anderen Prozess (kein Python). Das heisst es kann nicht das gleiche Programm sein bzw. das miniterm läuft schon im Hintergrund. Dann erfolgt zu irgendeinem Zeitpunkt der Aufruf mit welchem ich dann das miniterm ansprechen möchte. Da das miniterm nur Tastendrücke empfängt um die RTS-Leitung zu toggeln wollte ich es eben so realisieren, dass einfach per pywinauto dieser Tastendruck gesendet wird von einem anderen Prozess aus.
Du sagst man kann dies via RPC-Schnittstelle lösen was ein guter Ansatz ist. Würdest du dann darüber die Tastendrücke absetzten? Wie weiss ich dann welches Programm (miniterm) diese empfangen muss?
@MyPy17: Warum läuft das denn in einem anderen Prozess und warum ist das kein Python? Wenn das kein Python ist, dann nützt doch auch keine Python-Lösung um Tastendrücke zu senden.
Du willst anscheinend nicht sagen welches konkrete Gesamtproblem da eigentlich gelöst werden soll. Dann kann man halt auch schlecht Lösungen vorschlagen.
“Ich bin für die Todesstrafe. Wer schreckliche Dinge getan hat, muss eine angemessene Strafe bekommen. So lernt er seine Lektion für das nächste Mal.” — Britney Spears, Interview in der französischen Zeitung Libération, 2. April 2002
__blackjack__ hat geschrieben: Mittwoch 26. April 2023, 15:12
Problemstellung:
Wie kann ich das RTS-Signal einer seriellen Schnittstelle ein- oder ausschalten wenn dies von einem externen Prozess aus gesteuert werden soll? Vom externen Prozess gibt es folgende Möglichkeiten: - benutzen eines Batch-Files (Win)
- starten eines Pythonskriptes
@MyPy17: Dafür würde man einfach einen Dienst schreiben der die RTS-Leitung schalten kann und zum Beispiel per Socket eine Schnittstelle zur Verfügung stellt. Da ist kein Miniterm für nötig und auch keine Fernsteuerung von anderen GUI-Programmen. Für die Socket-Kommunikation kann man sich natürlich ein eigenes Protokoll ausdenken und implementieren, aber ich würde da irgend etwas bestehendes verwenden. Eine HTTP-REST-API oder JSON-RPC oder etwas in der Richtung.
“Ich bin für die Todesstrafe. Wer schreckliche Dinge getan hat, muss eine angemessene Strafe bekommen. So lernt er seine Lektion für das nächste Mal.” — Britney Spears, Interview in der französischen Zeitung Libération, 2. April 2002
__blackjack__ hat geschrieben: Donnerstag 27. April 2023, 09:13
@MyPy17: Dafür würde man einfach einen Dienst schreiben der die RTS-Leitung schalten kann und zum Beispiel per Socket eine Schnittstelle zur Verfügung stellt. Da ist kein Miniterm für nötig und auch keine Fernsteuerung von anderen GUI-Programmen. Für die Socket-Kommunikation kann man sich natürlich ein eigenes Protokoll ausdenken und implementieren, aber ich würde da irgend etwas bestehendes verwenden. Eine HTTP-REST-API oder JSON-RPC oder etwas in der Richtung.
Das heisst man würde zum Beispiel einen Server socket laufen lassen und dann via dem Client zuerst eine serielle Schnittstelle öffnen und danach die RTS toggeln?