Kommandozeile per Python nutzen

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
Manni1990
User
Beiträge: 7
Registriert: Samstag 20. Juni 2015, 16:57

Hallo!

Ich schreibe gerade in Python ein Programm, um fsb-Dateien mit dem Programm FSBext zu öffnen. Es ist als kleines Einstiegsprogramm zum Üben gedacht (ich bin absoluter Neuling), da FSBext selbst die Kommandozeile nutzt.

Zum genauen Plan:
Mit folgendem Befehl in der Kommandozeile kann ich FSBext aufrufen, ihm einen Ordner zuweisen, in den die entpackten Dateien gespeichert werden sollen, und ihm sagen, welche fsb-Datei er entpacken soll:

(1) fsbext -d neuer_Speicherort Datei.fsb


Mit folgendem Befehl schaffe ich es bereits FSBext mit Python in der Kommandozeile zu öffen als würde ich einfach nur "fsbext" statt des oben angegebenen Befehls in der Kommandozeile nutzen:

(2) subprocess.call(r"C:\Users\Agando\Desktop\fsbext\fsbext.exe")

Erkennbar ist dies daran, dass mir dann die Optionen aufgelistet werden, die ich im Befehl unterbringen kann (wie z. B. das "-d", das ich oben benutze).
Daher kam ich auf die Idee, den oben genutzen Befehl (1) einfach genauso in den Python-Befehl (2) einzusetzen, also:

(3) subprocess.call(r"C:\Users\Agando\Desktop\fsbext\fsbext.exe" -d neuer_Speicherort Datei.fsb)


Leider bringt er mir nun die Fehlermeldung: SyntaxError: invalid syntax

Nun bin ich mir unsicher, ob es mit diesem Befehl überhaupt auf diese Weise möglich ist oder ob es vielleicht mehr Sinn macht, die Kommandozeile direkt mit dem oben aufgeführten Befehl (aber über Python) zu füttern. Dafür habe ich bis jetzt aber noch keine Lösung finden können.


Falls das wichtig ist, für die Variablen habe ich folgendes eingegeben:

(4) neuer_Speicherort - r„C:\Users\Agando\Desktop\fsbext\Ablage“
(5) Datei.fsb - r"C:\Program Files (x86)\Origin Games\Kingdoms of Amalur Reckoning\content\004\German\tech_only_lorestones.fsb"

Das r habe ich jeweils vorangestellt, damit es mit den "\" keine Probleme gibt.


Ich denke, ich habe alles wichtige erzählt, und hoffe sehr auf Eure Hilfe.


Viele Grüße
Benutzeravatar
darktrym
User
Beiträge: 785
Registriert: Freitag 24. April 2009, 09:26

Auch wenn kein einzige Frage darunter ist welche erkennbar durch ein Fragezeichen wäre, was erwartest du denn, wenn du

Code: Alles auswählen

subprocess.call(r"C:\Users\Agando\Desktop\fsbext\fsbext.exe" -d neuer_Speicherort Datei.fsb)
eingibst?
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Manni1990
User
Beiträge: 7
Registriert: Samstag 20. Juni 2015, 16:57

Ja, entschuldige. Ich wollte wissen, wie ich das Programm mit den notwendigen Parametern starten kann.

Ich erwarte, dass das Programm FSBext als Teilprozess des Python-Prgramms vollständig ausgeführt wird, also sich die fsb-Datei sucht, mir die darin enthaltenen Dateien abspeichert und sich dann beendet (so wie es das auch macht, wenn ich den Befehl in der Kommandozeile direkt eingebe und ENTER drücke).

Worauf willst du hinaus?


Ich hatte gerade noch den Einfall, dass der Fehler darin liegen könnte, dass ich den Befehl mit Anführungszeichen zusammenziehen muss. Dabei stoße ich jedoch auf das Problem, dass ich mit den Anführungszeichen mehrere Ebenen erzeugen müsste, da die einzelnen angesprochenen Dateipfade ebenfalls wegen darin vorkommender Leerzeichen durch Anführungszeichen als zusammengehörig markiert werden müssen. Gibt es dazu eine Lösung (falls das überhaupt das Problem lösen könnte)?
Benutzeravatar
darktrym
User
Beiträge: 785
Registriert: Freitag 24. April 2009, 09:26

Du kannst natürlich auch eine Liste verwenden, so wie es die Doku zeigt.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Manni1990
User
Beiträge: 7
Registriert: Samstag 20. Juni 2015, 16:57

Du meinst wie folgt:

subprocess.call([r"C:\Users\Agando\Desktop\fsbext\fsbext.exe", "-d neuer_Speicherort", "Datei.fsb"]) ?

Falls du das so meinst, funktioniert es bei mir nicht. Ich habe es jetzt mit verschiedenen Kombinationen von Anführungszeichen, Klammern und Variablen, die die Textteile beinhalten, probiert und mir gehen gerade die Ideen aus, wo mein Denkfehler liegt.

Edit
Die Fehlermeldung bei obigem Versuch lautet:
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 5-6: truncated \UXXXXXXXX escape

und ich kann bisher noch nicht viel damit anfangen.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@Manni1990: Wenn die Fehlermeldung kommt, hast Du ein r vor dem String vergessen. Bei subprocess gilt, ein Argument ein Element der Liste. "-d neuer_Speicherort" sind eigentlich 2. Soll neuer_Speicherort eine Variable sein, dann hat sie auch nichts in einem String verloren.

Code: Alles auswählen

subprocess.call([r"C:\Users\Agando\Desktop\fsbext\fsbext.exe", "-d", neuer_Speicherort, "Datei.fsb"])
Manni1990
User
Beiträge: 7
Registriert: Samstag 20. Juni 2015, 16:57

Alles klar. Ich habe das in das restliche Programm so eingebettet und es funktioniert! Ich habe (zur besseren Übersicht im Programm zum Ändern der Pfade) noch alles in Variablen verpackt.

Vielen Dank an euch!!!
Damit ist wieder ein kleiner Schritt in dem Programm erledigt. Ich werde noch ein paar Kleinigkeiten (nennen wir es Spielereien zum Herumprobieren) einbauen.

Wenn das alles so klappt, wie ich mir das vorstelle, würde ich es gern mal vorstellen. Vielleicht gibt es ja noch Ideen, wie das Programm verbessert werden kann oder was sich damit noch üben und kennenlernen lässt. Wäre das was für das Showcase im Skript-Forum?
Antworten