Seite 1 von 1
In den STDIN eines bestehenden Konsolenfensters schreiben (Windows)
Verfasst: Freitag 1. Januar 2021, 21:49
von KingBaehr
Hallo,
ist es möglich mittels eines Python Programmes Daten (genauer: eine Zeichenkette oder ASCII-Code o.ä.) an einen bestimmten Windows Prozess zu übergeben und dass in Windows?
Also dass man zum Beispiel ein Python Script hat dass einen bestimmten Windows Prozess herausfindet (z.Bsp. ein bestehendes Terminal Fenster) und dann an dieses eine Zeichenkette übergibt (z.Bsp. sowas wie "ipconfig"). Den Output brauch ich zwar nicht unbedingt, wär aber gut wenn man den dann auch "extrahieren" könnte.
Meine genaue Situation ist folgende: Ich würde gerne ein kleines Programm schreiben dass in die Kommandozeile der Lichtsteuerungssoftware "GrandMa3 onPc" Befehle eingeben kann (Diese Software besitzt ja auch ein reines Kommandozeilen Fenster als eigenständigen Prozess).
Diese Software besitzt auch eine Websteuerung; vll geht dass dann auch darüber...
Ich habe zwar im Internet ein paar Lösungen gefunden, allerdings funktionieren diese oftmals nur unter Linux. Ich bin aber zwangsläufig für mein Vorhaben auf Windows angewiesen...
Danke schon mal im voraus
Re: In den STDIN eines bestehenden Konsolenfensters schreiben (Windows)
Verfasst: Freitag 1. Januar 2021, 22:08
von __deets__
Du kannst mit autogui oder aehnlichen Tools direkt Tastendruecke an ein Fenster schicken. Es bekommt dann allerdings auch zwangsweise den Fokus. Keine Ahung, ob das stoert. Etwas abzugreifen ist dann allerdings nicht moeglich. Schlussendlich unterliegt ein solches Fenster der alleinigen Kontrolle des Prozesses, der es erstellt. Da kann man bestenfalls die Pixel von bekommen (wie beim screen-recording), und dann versuchen, daraus wieder Text zu machen. Aber das ist aufwendig!
Du schreibst nicht, welche Loesungen du schon gefunden hast. Also kann man nicht beurteilen, ob die auch eine Chance auf Nutzung unter Windows haetten.
Re: In den STDIN eines bestehenden Konsolenfensters schreiben (Windows)
Verfasst: Freitag 1. Januar 2021, 22:28
von KingBaehr
Erst mal vielen Dank für deine schnelle Antwort __deets__
nehmen sich diese Tools dann den Fokus auf das zu bedienende Programm auf sich oder kann es dabei dann zu Problemen kommen, wenn man Beispielsweise als Benutzer zusätzlich Chrome öffnet?
Wie gesagt, die Ausgabe wäre nicht zwingend erforderlich, auf diese könnte ich auch verzichten...
Wegen der anderen Lösungen kann ich nochmal schauen dass ich die nochmal finde (ist schon einige Zeit her wo ich die gefunden hatte und da ich damals zumindest dachte dass die sowieso nicht unter Windows funktionieren, habe ich diese erst mal ignoriert. Ich schaue, ob ich diese noch einmal finde und würde sie dann hier nochmal reinschreiben...)
LG
Re: In den STDIN eines bestehenden Konsolenfensters schreiben (Windows)
Verfasst: Sonntag 3. Januar 2021, 23:42
von KingBaehr
Also nochmal ein Update zu meinem Problem: Ich habe mich nochmal dran gesetzt und mithilfe der Dokumentation von subprocess (und nachdem ich das Modul generell mal versucht habe zum größten Teil zu verstehen...) einen Code geschrieben, welcher mein Problem Tatsächlich am "besten" löst. Dabei wird der Client zwar nach jedem eingegebenen und abgesendeten Befehl wieder geschlossen, aber für mich reicht dass wie gesagt erst einmal so. Da ich selbst damit ja jetzt schon eine geraume Zeit verzweifelt damit verbracht habe fertigen Code für Windows zu finden (was nicht wirklich geklappt hat), will ich euch meine Lösung jetzt nicht vorenthalten. Daher hier meine Lösung:
WICHTIG:
Ich habe die "app_terminal" (Der Kommandozeilen Client der Lichtsteuerungs Software) in die PATH Variable hinzugefügt. Sonst geht das ganze mit diesem Code nicht! (-> googlen wie man Programme zu der PATH hinzufügt

)
#Python Code (3.9)
Code: Alles auswählen
from subprocess import *
while True:
comm = bytes(input("Den Befehl eingeben: "), encoding='utf-8')
child = Popen(["app_terminal","CMDLINE 192.168.178.35"], stdout=PIPE, stdin=PIPE, stderr=STDOUT, shell=True)
print("Connected Succesfully!")
data = child.communicate(input=comm)
print("send Command Successfully!")
print("Go to child wait...")
try:
child.terminate()
except:
pass
print("Process finished!\n")
# Code ende
PS: Die IP Adresse muss durch die IP Adresse ersetzt werden, von dem PC, auf dem die "GrandMA3 OnPC" läuft.
Re: In den STDIN eines bestehenden Konsolenfensters schreiben (Windows)
Verfasst: Montag 4. Januar 2021, 00:19
von __blackjack__
@KingBaehr: Das ist reichlich umständlich das mit `Popen` zu machen, da würde auch `subprocess.run()` ausreichen. Die Mischung aus Liste und ``shell=True`` ist komisch. Verwende die Liste richtig und lass die Shell weg.
Das `child.terminate()` ist unsinnig, denn `communicate()` kehrt erst zurück wenn das externe Programm fertig ist. Das ist dann bereits beendet.
Sternchen-Importe sind Böse™. Das macht Programme unnötig unübersichtlicher und fehleranfälliger und es besteht die Gefahr von Namenskollisionen.
Re: In den STDIN eines bestehenden Konsolenfensters schreiben (Windows)
Verfasst: Montag 4. Januar 2021, 00:25
von __blackjack__
Ungetestet:
Code: Alles auswählen
#!/usr/bin/env python3
import subprocess
def main():
while True:
subprocess.run(
["app_terminal", "CMDLINE", "192.168.178.35"],
input("Den Befehl eingeben: "),
check=True,
encoding="utf-8",
)
print("Sent command successfully!")
print("Process finished!\n")
if __name__ == "__main__":
main()
Re: In den STDIN eines bestehenden Konsolenfensters schreiben (Windows)
Verfasst: Montag 4. Januar 2021, 00:39
von KingBaehr
@_blackjack_ Ok ich werd das dann nochmal so abändern wie von dir vorgeschlagen.
Vielen Dank dass du dir das nochmal angesehen hast und optimiert/verbessert hast und mir dabei Tipps für zukünftigen Code gegeben hast.
Ich hatte mich dafür eingesagt durch die Dokumentation geschlagen und musste erst mal das Modul richtig kennen lernen. Aber nochmals vielen Dank für deine Mühe!
LG