os.system bändigen

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
joh#
User
Beiträge: 139
Registriert: Freitag 6. November 2009, 13:16

Hallo,

ich möchte zwischen 2 'normalen' python Befehlen einen os.system Aufruf ausführen:

Code: Alles auswählen

import os

ta=raw_input('ta ')
os.system('C:\\freemind.exe c:\\test.mm')
tb=raw_input('tb ')
(freemind ist eine java-Anwendung) Was passiert ist, daß nach dem ersten Enter gleich das 2. Enter
erwartet wird und (scheinbar) gleichzeitig freemind gestartet wird. Ich möchte es aber hübsch der
Reihe nach, wie niedergeschrieben (also erst nach explizitem Beenden von fm).

Gruß
joh
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ersetze es mal durch:

Code: Alles auswählen

subprocess.call('C:\\freemind.exe c:\\test.mm', shell=True)
Das wartet ab, bis der Prozess beendet ist. Sollte daher also funktionieren.

Und dann noch der übliche Hinweis: Die Variante über `shell=True` birgt ein potenzielles Sicherheitsrisiko oder ggf andere Probleme, die in Zusammenhang mit der zwischengeschalteten Shell stehen können. Der empfohlene Weg lautet:

Code: Alles auswählen

subprocess.call([r'C:\freemind.exe', r'c:\test.mm'])
In deinem Fall macht das keinen großen Unterschied, aber es beugt vorab "Irritationen" vor, die vielleicht mal später bei der Verwendung von `subprocess` auftreten könnten. Zu den Details, siehe Doku.
joh#
User
Beiträge: 139
Registriert: Freitag 6. November 2009, 13:16

also sowohl mit als auch shell=True liefert subprocess.call das gleiche
Ergebnis: auch hier wird schon nach tb gefragt, obwohl der subprocess
gerade erst mal startet ...
lunar

@joh#: Windows unterscheidet verschiedene Typen von ausführbaren Dateien. "freemind.exe" ist wohl kein Konsolen-Programm, sondern ein Win32-Programm, und solche werden immer im Hintergrund gestartet, sprich, "os.system()" kehrt sofort zurück.

Erkennen kannst Du Win32-Programme daran, dass sich keine Eingabeaufforderung öffnet, wenn Du die EXE direkt aus dem Explorer startest.

Verhindern kannst Du das meines Wissens nicht. In diesem Fall hast Du einfach Pech gehabt. Du kannst allerdings versuchen, die Java-Dateien – meist eine JAR-Datei – dieses Programms mit "java.exe" direkt zu starten.
joh#
User
Beiträge: 139
Registriert: Freitag 6. November 2009, 13:16

lunar hat geschrieben:@joh#: Du kannst allerdings versuchen, die Java-Dateien – meist eine JAR-Datei – dieses Programms mit "java.exe" direkt zu starten.
Das traf den Nagel auf seinen empfangsbereiten Kopf!
Danke.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Da lunar es nicht direkt angesprochen hat, hier noch von mir eine Anmerkung: `os.system()` ist vom Ergebnis her so ziemlich das selbe wie ein `subprocess.call()` mit `shell=True` ohne weitere Argumente. Ich muss mir echt mal wieder angewöhnen, mehr zu recherchieren, bevor ich einen Beitrag verfasse. Ist eigentlich nicht meine Art, halbgares Wissen auszuspucken. Sowas ärgert mich bei anderen Leuten ja ebenso. Ich bin halt davon ausgegangen, dass `os.system()` *nicht* wartet, bis der Prozess einen Rückgabewert liefert. Schande über mich...

Trotz alledem ist `subprocess` weiterhin die Empfehlung für solche Geschichten, einfach aus dem Grund, weil es umfangreicher und bequemer ist für das Arbeiten mit anderen Programmen.
Antworten