Ausführen von cmd Befehlen über subprocess?

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.
amateu0815
User
Beiträge: 12
Registriert: Dienstag 5. November 2019, 09:11

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'])
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du subprocess benutzt, dann kannst du dein Programm *gleich* ausfuehren, es gibt keinen Grund, da cmd.exe zwischenzuschalten.
amateu0815
User
Beiträge: 12
Registriert: Dienstag 5. November 2019, 09:11

__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?
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

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()"])
amateu0815
User
Beiträge: 12
Registriert: Dienstag 5. November 2019, 09:11

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!
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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,
    )
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
amateu0815
User
Beiträge: 12
Registriert: Dienstag 5. November 2019, 09:11

__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?
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
amateu0815
User
Beiträge: 12
Registriert: Dienstag 5. November 2019, 09:11

__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?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
amateu0815
User
Beiträge: 12
Registriert: Dienstag 5. November 2019, 09:11

__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.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
amateu0815
User
Beiträge: 12
Registriert: Dienstag 5. November 2019, 09:11

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 ()
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

@__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.
amateu0815
User
Beiträge: 12
Registriert: Dienstag 5. November 2019, 09:11

__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?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mit String formatting
amateu0815
User
Beiträge: 12
Registriert: Dienstag 5. November 2019, 09:11

__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?
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

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?
Antworten