web-dev-qa-db-de.com

Starten Sie einen Shell-Befehl mit einem Python-Skript, warten Sie auf die Beendigung und kehren Sie zum Skript zurück

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()?

48
Davide Gualano

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
85
user39307

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()
58
Harley Holcombe

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 )
    Die Standardausgabe wird unterdrückt (Vorsicht, wenn 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.
12
deft_code

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().

7
unbeknown

verwenden Sie Spawn

import os
os.spawnlp(os.P_WAIT, 'cp', 'cp', 'index.html', '/dev/null')
3

das hat für mich gut funktioniert!

Shell_command = "ls -l" subprocess.call(Shell_command.split())

0
rollthedice32

Ich benutze os.system

import os
os.system("pdftoppm -png {} {}".format(path2pdf, os.path.join(tmpdirname, "temp")))
0
Nikolay Frick