Ich habe ein Python-Skript, das für jede Datei in einem Verzeichnis einen Shell-Befehl starten muss:
import os
files = os.listdir(".")
for f in files:
os.execlp("myscript", "myscript", f)
Dies funktioniert gut für die erste Datei, aber nachdem der Befehl "myscript" beendet ist, wird die Ausführung angehalten und kehrt nicht zum Python-Skript zurück.
Wie kann ich? Muss ich fork()
vor calling os.execlp()
?
unterprozess: Das Modul
subprocess
können Sie neue Prozesse erzeugen, Verbinden Sie sich mit ihrem Eingang/Ausgang/Fehler Rohre und erhalten ihre Rückgabecodes.
http://docs.python.org/library/subprocess.html
Verwendungszweck:
import subprocess
process = subprocess.Popen(command, Shell=True, stdout=subprocess.PIPE)
process.wait()
print process.returncode
Sie können subprocess.Popen
verwenden. Es gibt mehrere Möglichkeiten, dies zu tun:
import subprocess
cmd = ['/run/myscript', '--arg', 'value']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
for line in p.stdout:
print line
p.wait()
print p.returncode
Oder wenn es Ihnen egal ist, was das externe Programm tatsächlich macht:
cmd = ['/run/myscript', '--arg', 'value']
subprocess.Popen(cmd).wait()
Das Subprozess-Modul ist seit 2008 auf dem Vormarsch. Insbesondere machen check_call
und check_output
einfache Subprozess-Aufgaben noch einfacher. Die _check_*
_ -Funktionen sind nett, dass sie eine Ausnahme auslösen, wenn etwas schief geht.
_import os
import subprocess
files = os.listdir('.')
for f in files:
subprocess.check_call( [ 'myscript', f ] )
_
Jede Ausgabe, die von myscript
generiert wird, wird so angezeigt, als ob Ihr Prozess die Ausgabe erstellt hat (technisch gesehen haben myscript
und Ihr python Skript dieselbe Standardausgabe). Es gibt verschiedene Möglichkeiten, dies zu vermeiden.
check_call( [ 'myscript', f ], stdout=subprocess.PIPE )
myscript
mehr als 4 KB Ausgabe produziert). stderr wird weiterhin angezeigt, es sei denn, Sie fügen die Option _stderr=subprocess.PIPE
_ hinzu.check_output( [ 'myscript', f ] )
check_output
_ gibt die Standardausgabe als Zeichenfolge zurück, sodass sie nicht angezeigt wird. stderr wird weiterhin angezeigt, es sei denn, Sie fügen die Option _stderr=subprocess.STDOUT
_ hinzu.Die os.exec*()
-Funktionen ersetzen das aktuelle Programm durch das neue Programm. Wenn dieses Programm endet, ist auch Ihr Prozess beendet. Sie möchten wahrscheinlich os.system()
.
verwenden Sie Spawn
import os
os.spawnlp(os.P_WAIT, 'cp', 'cp', 'index.html', '/dev/null')
das hat für mich gut funktioniert!
Shell_command = "ls -l"
subprocess.call(Shell_command.split())
Ich benutze os.system
import os
os.system("pdftoppm -png {} {}".format(path2pdf, os.path.join(tmpdirname, "temp")))