subprocess, Ergebnis aus cmd speichern

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.
Antworten
reneh
User
Beiträge: 5
Registriert: Donnerstag 9. August 2018, 14:04

Guten Abend,

zur Testautomatisierung verwende ich Squish in Kombination mit Python. Für einen Test möchte ich eine Anweisung in der Kommandozeile ausführen und möchte mir das Ergebnis (ist eine Anzahl von Objekten in der Datenbank) speichern. Es ist dabei egal, ob das Ergebnis direkt in einer Variablen gespeichert wird oder erst z.B. in einer txt zwischengespeichert wird.
Wenn ich das ganze manuell durchführe ist alles kein Problem. Wenn ich es über Squish mit Python (oder nur über die Python idle ohne Squish) mache, wird der Befehl ausgeführt und erscheint in der cmd auch korrekt, die txt wird auch erstellt, aber er schreibt nix in die txt. Er sagt, dann dass er auf die neu erstellte txt nicht zugreifen kann, da diese in Benutzung ist.

Mein erster Ansatz war :
os.system("programmpfad/programm.exe befehl > text.txt") Hierbei war es egal, ob ich den Pfad der txt statisch oder dynamisch angebe. Der Fehler kam trotzdem.

Mein zweiter Ansatz war über:
subprocess.check_output() Hier weiß ich aber leider garnicht was ich da wie Parametrieren muss.

Ist es egal welchen von beiden man verwendet und wie wäre ein Befehl, dass er tatsächlich was in die txt schreibt???

Kann mir jemand helfen?
DAnke und viele Grüße
rh
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst stdout und/oder stdin mit subprocss.PIPE als Wert übergeben. Dann werden die zurück geliefert.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Für den konkreten Fehler brauchen wir auch den passenden Code. Ich vermute, da Du ja ins aktuelle Arbeitsverzeichnis schreiben willst, dass das anders ist, als Du denkst.

`check_output` speichert die Ausgabe in einer Variable, was ja besser ist, wenn man die Daten weiterverarbeiten will.

Code: Alles auswählen

output = subprocess.check_output(["programmpfad/programm.exe", "befehl"])
reneh
User
Beiträge: 5
Registriert: Donnerstag 9. August 2018, 14:04

Also mit :

Code: Alles auswählen

def findeDatei(name, path):
    for root, dirs, files in os.walk(path):
        if name in files:
            return os.path.join(root, name)
            
suche ich mir erstmal den Pfad des Programms, da das ganze dynamisch sein soll. Erzeugt wird der Pfad dann mit doppeltem Backslash. Also sowas: D:\\Programme\\prog.exe Ist das soweit ein Problem?

Meine Eigentliche Zeile ist dann:

Code: Alles auswählen

output = subprocess.check_output([str_cmdPfad, "xod -x"], stdin=subprocess.PIPE, stderr=subprocess.PIPE)
str_cmdPfad = Pfad inklusive Programm.exe
xod -x = Der Befehl

Was mir den Fehler wirft:
CalledProcessError: Command '['D:/Programme/mehrPfad/prog.exe', 'xod -x']' returned non-zero exit status 255
reneh
User
Beiträge: 5
Registriert: Donnerstag 9. August 2018, 14:04

Den Fehler am Ende wirft er in dem Fall mit festem Pfad, also ohne die Verwendung der Funktion "findeDatei"
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@reneh: Ist 'xod -x' tatsächlich *ein* Argument? Also rufst Du das manuell auf der Kommandozeile so auf: D:/Programme/mehrPfad/prog.exe "xod -x"

Oder doch eher so: D:/Programme/mehrPfad/prog.exe xod -x
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mit anderen Worten: Jedes Argument muss ein eigenes Element in der Liste sein. Falls es xod -x auf der Kommandozeile ist, dann musst du [programm, 'xod', '-x'] eingeben.
Antworten