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

amateu0815 hat geschrieben: Mittwoch 6. November 2019, 12:05 Irgendwie bekomme ich das nicht hin.
Er übernimmt mir nur "Path" und nicht den Inhalt von "Path"
Wie soll der fertige Befehl aussehen?
Zeig uns was du hast. Nicht eine wolkige Beschreibung dessen.
amateu0815
User
Beiträge: 12
Registriert: Dienstag 5. November 2019, 09:11

import gom
import subprocess
import string

RESULT=gom.script.sys.execute_user_defined_dialog (content='<dialog>' \
' <title>Auswahl des Projektordners</title>' \
' <style></style>' \
' <control id="OkCancel"/>' \
' <position>center</position>' \
' <embedding>always_toplevel</embedding>' \
' <sizemode>fixed</sizemode>' \
' <size width="520" height="131"/>' \
' <content columns="2" rows="1">' \
' <widget column="0" rowspan="1" type="label" row="0" columnspan="1">' \
' <name>Text1</name>' \
' <tooltip></tooltip>' \
' <text>Pfad auswählen</text>' \
' <word_wrap>false</word_wrap>' \
' </widget>' \
' <widget column="1" rowspan="1" type="input::string" row="0" columnspan="1">' \
' <name>input</name>' \
' <tooltip></tooltip>' \
' <value>B:\\USERS\\sa\\Makro_Test\\08_11_2018_ZV.aramis</value>' \
' <read_only>false</read_only>' \
' </widget>' \
' </content>' \
'</dialog>')

old_path = RESULT.input
print (old_path)
Path = format(old_path)
print (Path)
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 ()
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Warum führst du denn das andere Script über Subprocess aus, wenn du doch eh schon dieses "gom" benutzt?
Was hindert dich, die Funktion einfach aufzurufen?
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@amateu0815: Der Import von `string` wird nirgends verwendet.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). `RESULT` und `Path` sind also falsch geschrieben.

Die ganzen "\" an den Zeilenenden sind überflüssig — solange es noch offene Klammern gibt, weiss der Compiler dass da noch was kommen muss.

`format()` nur mit einer Zeichenkette als Wert macht genau gar nichts ausser die Zeichenkette genau so als Ergebnis zu liefern. Du musst den Pfad in die Zeichenkette hineinformatieren wo die Testfunktion aufgerufen wird, als Argument für diese Funktion. Und die musst Du dann so umschreiben, dass sie den Pfad als Argument erwartet und etwas sinnvollen damit tut. Dazu brauchst Du die `format()`-Methode auf Zeichenketten, nicht die `format()`-Funktion. Oder ab Python 3.6 ein f-Zeichenkettenliteral.

Wenn Du `Popen` verwendest und die Standardausgabe von dem Prozess ”pipe”st, dann kannst Du danach nicht einfach auf das Prozessende warten, sondern musst die Pipe auch auslesen. Wenn Du das nicht machst, kann es ganz leicht zu einer Verklemmung kommen: Der externe Prozess schreibt etwas nach `stdout` und blockiert wenn der Puffer zwischen den beiden Prozessen voll ist. Dann wartet Dein Programm darauf das der externe Prozess endet, und der externe Prozess wartet bis Du die Ausgabe liest damit er zum Ende kommen kann. Beide warten dann bis in alle Ewigkeit aufeinander, oder zumindest bis Dir das warten zu langweilig wird und Du mindestens einen der beiden Prozesse beendest.

Ungetestet:

Code: Alles auswählen

import subprocess

import gom


result = gom.script.sys.execute_user_defined_dialog(
    content='<dialog>'
    ' <title>Auswahl des Projektordners</title>'
    ' <style></style>'
    ' <control id="OkCancel"/>'
    ' <position>center</position>'
    ' <embedding>always_toplevel</embedding>'
    ' <sizemode>fixed</sizemode>'
    ' <size width="520" height="131"/>'
    ' <content columns="2" rows="1">'
    '  <widget column="0" rowspan="1" type="label" row="0" columnspan="1">'
    '   <name>Text1</name>'
    '   <tooltip></tooltip>'
    '   <text>Pfad auswählen</text>'
    '   <word_wrap>false</word_wrap>'
    '  </widget>'
    '  <widget column="1" rowspan="1" type="input::string" row="0" columnspan="1">'
    '   <name>input</name>'
    '   <tooltip></tooltip>'
    '   <value>B:\\USERS\\sa\\Makro_Test\\08_11_2018_ZV.aramis</value>'
    '   <read_only>false</read_only>'
    '  </widget>'
    ' </content>'
    '</dialog>'
)

completed = subprocess.run(
    [
        "C:/Program Files/GOM/2018/bin/start_gom.exe",
        "aramis",
        "-kiosk",
        "-eval",
        f"gom.script.userscript.test({result.input!r})",
    ],
    stdout=subprocess.PIPE,
    check=True,
)
print(completed.stdout)
Wobei es etwas komisch aussieht das Du offenbar Zugriff auf ein `gom`-Modul hast das anscheinend diese Software steuern kann und dann aus so einem Programm heraus ein externes Programm zum Starten von "gom" ausführst. Etwas verwirrend.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Und wahrscheinlich ohne den möglicherweise überflüssigen Einsatz von Subprocess:

Code: Alles auswählen

import gom

result = gom.script.sys.execute_user_defined_dialog(
    content='<dialog>'
    ' <title>Auswahl des Projektordners</title>'
    ' <style></style>'
    ' <control id="OkCancel"/>'
    ' <position>center</position>'
    ' <embedding>always_toplevel</embedding>'
    ' <sizemode>fixed</sizemode>'
    ' <size width="520" height="131"/>'
    ' <content columns="2" rows="1">'
    '  <widget column="0" rowspan="1" type="label" row="0" columnspan="1">'
    '   <name>Text1</name>'
    '   <tooltip></tooltip>'
    '   <text>Pfad auswählen</text>'
    '   <word_wrap>false</word_wrap>'
    '  </widget>'
    '  <widget column="1" rowspan="1" type="input::string" row="0" columnspan="1">'
    '   <name>input</name>'
    '   <tooltip></tooltip>'
    '   <value>B:\\USERS\\sa\\Makro_Test\\08_11_2018_ZV.aramis</value>'
    '   <read_only>false</read_only>'
    '  </widget>'
    ' </content>'
    '</dialog>'
)

gom.script.userscript.test(result.input)
amateu0815
User
Beiträge: 12
Registriert: Dienstag 5. November 2019, 09:11

sparrow hat geschrieben: Mittwoch 6. November 2019, 12:13 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?
Ich arbeite einmal mit der Software "Aramis v6.3" und einmal mit der Software "Aramis Professional v2018"
Beide Softwares haben Phyton integriert, daher auch die spezielle GOM Bibliothek.
Ich starte eine Skript in der Software "Aramis Professional v2018". Dort muss ich ein Zielpfad über ein Popup eingeben, wo sich bestimmte Projekte befinden. Die Projekte sind jedoch Projekte, die nur die Software "Aramis v6.3" öffnen kann. Daher brauche ich den subprocess um die Software "Aramis v6.3" zu öffnen und anschliessend dort diese Projekte (aus dem ausgewählten Pfad) zu öffnen und diese mit einem in der Software "Aramis v6.3" geschriebenen Skript zu bearbeiten.
Das Öffnen und ausführen des Skripts läuft mit dem vorhin geposteten subprocess Befehl. Nur der Übertrag des ausgewählten "Path" in die Software "Aramis v6.3" bekomme ich nicht hin
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

amateu0815 hat geschrieben: Mittwoch 6. November 2019, 12:51 Das Öffnen und ausführen des Skripts läuft mit dem vorhin geposteten subprocess Befehl. Nur der Übertrag des ausgewählten "Path" in die Software "Aramis v6.3" bekomme ich nicht hin
__blackjack__ hat dir doch in seinem Post gezeigt, wie der Pfad in den Aufruf kommt. Hast du das probiert?
amateu0815
User
Beiträge: 12
Registriert: Dienstag 5. November 2019, 09:11

__deets__ hat geschrieben: Mittwoch 6. November 2019, 12:57
amateu0815 hat geschrieben: Mittwoch 6. November 2019, 12:51 Das Öffnen und ausführen des Skripts läuft mit dem vorhin geposteten subprocess Befehl. Nur der Übertrag des ausgewählten "Path" in die Software "Aramis v6.3" bekomme ich nicht hin
__blackjack__ hat dir doch in seinem Post gezeigt, wie der Pfad in den Aufruf kommt. Hast du das probiert?
Habe ich probiert, da bekomme ich ein Sytaxfehler.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich geb auf.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Du bekommst wahrscheinlich einen Syntaxfehler weil Du eine zu alte Python-Version benutzt, die keine f-Strings unterstützt, und man statt dessen format benutzen muß:

Code: Alles auswählen

"gom.script.userscript.test({!r})".format(result.input)
Aber es ist mühselig, bei jeder Deiner Antworten nachfragen zu müssen, was Du konkret für Code ausgeführt hast, was die exakte Fehlermeldung ist, etc. Hier war es noch relativ einfach zu raten, aber sonst besitzt hier auch niemand eine Kristallkugel, die direkt in Dein Wohnzimmer schauen kann.
Antworten