Seite 1 von 2

Ausführen von cmd Befehlen über subprocess?

Verfasst: Dienstag 5. November 2019, 10:20
von amateu0815
Hi Zusammen,

ich möchte gern die cmd über Phyton starten und anschließend dort ein Befehl ausführen.
Aktuell setze ich das Öffnen der cmd mit dem Befehl "subprocess" um. Die cmd Öffnet sich zwar, aber wie kann ich dann in der cmd automatisch einen Befehl ausführen?

Mein Code:
subprocess.Popen(['C:\Windows\system32\cmd.exe'])

Re: Ausführen von cmd Befehlen über subprocess?

Verfasst: Dienstag 5. November 2019, 10:42
von __deets__
Wenn du subprocess benutzt, dann kannst du dein Programm *gleich* ausfuehren, es gibt keinen Grund, da cmd.exe zwischenzuschalten.

Re: Ausführen von cmd Befehlen über subprocess?

Verfasst: Dienstag 5. November 2019, 10:55
von amateu0815
__deets__ hat geschrieben: Dienstag 5. November 2019, 10:42 Wenn du subprocess benutzt, dann kannst du dein Programm *gleich* ausfuehren, es gibt keinen Grund, da cmd.exe zwischenzuschalten.
Nicht wirklich. Ich möchte das ein Programm starten, was schon eine Python Software integriert hat. Ich möchte das Programm starten und gleichzeitig ein Skript in diesem Programm ausführen.
Um es etwas genauer zu Beschreiben: Ich starte ein Python Skript, dieses öffnet eine Software, die dann auch gleich ein Skript ausführt.
Dies geht über ein Shortcut, aber nicht im Python direkt.
Mein Code den ich in die cmd eingeben will:
"C:\Program Files\GOM\2018\bin\start_gom.exe" aramis -eval "gom.script.userscript.test()"
Wenn ich das in die cmd eingebe, dann startet die Software und anschließend startet auch das in die Software integrierte Skript. Gibt es evtl. eine andere Möglichkeit dies umzusetzen?

Re: Ausführen von cmd Befehlen über subprocess?

Verfasst: Dienstag 5. November 2019, 11:03
von Sirius3
Und was hindert Dich daran, genau diesen Aufruf subprocess zu übergeben?

Code: Alles auswählen

gom = subprocess.Popen(["C:/Program Files/GOM/2018/bin/start_gom.exe", "aramis", "-eval", "gom.script.userscript.test()"])

Re: Ausführen von cmd Befehlen über subprocess?

Verfasst: Dienstag 5. November 2019, 12:21
von amateu0815
Sirius3 hat geschrieben: Dienstag 5. November 2019, 11:03 Und was hindert Dich daran, genau diesen Aufruf subprocess zu übergeben?

Code: Alles auswählen

gom = subprocess.Popen(["C:/Program Files/GOM/2018/bin/start_gom.exe", "aramis", "-eval", "gom.script.userscript.test()"])
So easy?! Besten Dank dafür!

Re: Ausführen von cmd Befehlen über subprocess?

Verfasst: Dienstag 5. November 2019, 13:42
von __blackjack__
@amateu0815: Naja, wie fehlt noch das warten auf das Ende des Programms. Falls Du das nicht selbst machen willst, beziehungsweise sonst nichts anderes mit `gom` machst, kann man statt `Popen` auch die `run()`-Funktion verwenden. In dem Fall könnte das beispielsweise so aussehen:

Code: Alles auswählen

    subprocess.run(
        [
            "C:/Program Files/GOM/2018/bin/start_gom.exe",
            "aramis",
            "-eval",
            "gom.script.userscript.test()",
        ],
        check=True,
    )

Re: Ausführen von cmd Befehlen über subprocess?

Verfasst: Dienstag 5. November 2019, 14:18
von amateu0815
__blackjack__ hat geschrieben: Dienstag 5. November 2019, 13:42 @amateu0815: Naja, wie fehlt noch das warten auf das Ende des Programms. Falls Du das nicht selbst machen willst, beziehungsweise sonst nichts anderes mit `gom` machst, kann man statt `Popen` auch die `run()`-Funktion verwenden. In dem Fall könnte das beispielsweise so aussehen:

Code: Alles auswählen

    subprocess.run(
        [
            "C:/Program Files/GOM/2018/bin/start_gom.exe",
            "aramis",
            "-eval",
            "gom.script.userscript.test()",
        ],
        check=True,
    )
Das fehlt mir natürlich auch noch.
Wie kann ich eine Software wieder schließen über ein Skript?
Gibt es auch die Möglichkeit in einem subprocess Parameter mitzunehmen?

Re: Ausführen von cmd Befehlen über subprocess?

Verfasst: Dienstag 5. November 2019, 16:23
von __blackjack__
@amateu0815: Die Software wieder ”schliessen” ginge wenn Du doch `Popen` verwendest und Dir das `Popen`-Objekt merkst. Und wenn Du das Programm beenden möchtest, kannst Du darauf die `terminate()`-Methode aufrufen (und danach mit `wait()` auf das tatsächliche Ende warten).

Wobei das den Prozess beendet und nicht irgendwie über ein Menü wie „Datei → Schliessen“ oder so geht. Wenn Du so etwas machen möchtest, müsstest Du Dir beispielsweise `pywinauto` anschauen.

Re: Ausführen von cmd Befehlen über subprocess?

Verfasst: Dienstag 5. November 2019, 17:03
von amateu0815
__blackjack__ hat geschrieben: Dienstag 5. November 2019, 16:23 @amateu0815: Die Software wieder ”schliessen” ginge wenn Du doch `Popen` verwendest und Dir das `Popen`-Objekt merkst. Und wenn Du das Programm beenden möchtest, kannst Du darauf die `terminate()`-Methode aufrufen (und danach mit `wait()` auf das tatsächliche Ende warten).

Wobei das den Prozess beendet und nicht irgendwie über ein Menü wie „Datei → Schliessen“ oder so geht. Wenn Du so etwas machen möchtest, müsstest Du Dir beispielsweise `pywinauto` anschauen.
Ich habe in der Software von GOM einen Befehl gefunden, um die Software nach dem Beenden zu schließen.

Zu meiner zweiten Frage mit der Übernahme von Parametern in den Subprocess bzw in die andere Software. Gibt es da einen Befehl diese mitzunehmen?

Re: Ausführen von cmd Befehlen über subprocess?

Verfasst: Dienstag 5. November 2019, 17:27
von __deets__
Was denn fuer Parameter? Es gibt keinen allgemeingueltigen Mechanismus, mit dem man einem Programm beliebige Dinge sagen kann. Entweder es nimmt die ueber die Kommandozeile. Oder nicht. Das sollte in der Dokumentation von start_gom.exe stehen.

Re: Ausführen von cmd Befehlen über subprocess?

Verfasst: Dienstag 5. November 2019, 19:45
von __blackjack__
Bei Windowssofware könnte es sein das die eine COM-Schnittstelle oder etwas ähnliches bietet. Auch da wäre wieder die Dokumentation des Programms gefragt.

Re: Ausführen von cmd Befehlen über subprocess?

Verfasst: Mittwoch 6. November 2019, 08:19
von amateu0815
__deets__ hat geschrieben: Dienstag 5. November 2019, 17:27 Was denn fuer Parameter? Es gibt keinen allgemeingueltigen Mechanismus, mit dem man einem Programm beliebige Dinge sagen kann. Entweder es nimmt die ueber die Kommandozeile. Oder nicht. Das sollte in der Dokumentation von start_gom.exe stehen.
Ich möchte gern einne Pfad, den ich im "ersten" Python auswähle, mit in das "zweite" interne Python nehmen.

Re: Ausführen von cmd Befehlen über subprocess?

Verfasst: Mittwoch 6. November 2019, 08:29
von Sirius3
Du rufst doch über Kommandozeile direkt eine Funktion auf: gom.script.userscript.test()
Der kannst Du einfach auch Parameter übergeben, also die Stringrepräsentation Deines Pfades.

Re: Ausführen von cmd Befehlen über subprocess?

Verfasst: Mittwoch 6. November 2019, 10:32
von amateu0815
Sirius3 hat geschrieben: Mittwoch 6. November 2019, 08:29 Du rufst doch über Kommandozeile direkt eine Funktion auf: gom.script.userscript.test()
Der kannst Du einfach auch Parameter übergeben, also die Stringrepräsentation Deines Pfades.
Ich kann natürlich alle möglichen Strings übertragen, ja.
Mein Programm läuft so, dass ich in einer Eingabeaufforderung einen Pfad auswähle ("Path"). Dieser soll dann übergeben werden. Und Zwar nicht als Variable "Path" sondern wirklich der vollständige Pfad (das Ergebnis also).

process = subprocess.Popen(["C:/Program Files/GOM/2018/bin/start_gom.exe", "aramis", "-kiosk", "-eval", "gom.script.userscript.test()", "Path"], stdout=subprocess.PIPE)
process.wait ()

Re: Ausführen von cmd Befehlen über subprocess?

Verfasst: Mittwoch 6. November 2019, 10:36
von __deets__
Das haben wir verstanden. Der muss als Argument an test übergeben werden, also IN den mit eval ausgeführten String. Entsprechend mit ' als Anführungszeichen.

Re: Ausführen von cmd Befehlen über subprocess?

Verfasst: Mittwoch 6. November 2019, 10:50
von Sirius3
@__deets__: besser als mit ' ist es, im Format-String !r anzugeben.

@amateu0815: wenn Du jetzt gleich danach `wait` aufrufst, kannst Du auch das von __blackjack__ vorgeschlagene subprocess.run verwenden.

Re: Ausführen von cmd Befehlen über subprocess?

Verfasst: Mittwoch 6. November 2019, 10:58
von amateu0815
__deets__ hat geschrieben: Mittwoch 6. November 2019, 10:36 Das haben wir verstanden. Der muss als Argument an test übergeben werden, also IN den mit eval ausgeführten String. Entsprechend mit ' als Anführungszeichen.
Und wie genau schreibe ich das in meinen Befehl?

Re: Ausführen von cmd Befehlen über subprocess?

Verfasst: Mittwoch 6. November 2019, 11:10
von __deets__
Mit String formatting

Re: Ausführen von cmd Befehlen über subprocess?

Verfasst: Mittwoch 6. November 2019, 12:05
von amateu0815
__deets__ hat geschrieben: Mittwoch 6. November 2019, 11:10 Mit String formatting
Irgendwie bekomme ich das nicht hin.
Er übernimmt mir nur "Path" und nicht den Inhalt von "Path"
Wie soll der fertige Befehl aussehen?

Re: Ausführen von cmd Befehlen über subprocess?

Verfasst: Mittwoch 6. November 2019, 12:13
von sparrow
Was probierst du denn? Zeig doch mal den Code.

Du sagst, du arbeitest an einem Python-Programm, das ein anderes Programm aufruft, das auch wieder Python-Code ausführst. Und wir reden hier davon, den Wert einer Variable in einer Zeichenkette unterzubringen. Das sind ja nun wirklich absolute Python-Grundlagen.
Wie ist denn der Rest des Programms drumherum entstanden?