问题
I\'ve a python script that has to launch a shell command for every file in a dir:
import os
files = os.listdir(\".\")
for f in files:
os.execlp(\"myscript\", \"myscript\", f)
This works fine for the first file, but after the \"myscript\" command has ended, the execution stops and does not come back to the python script.
How can I do? Do I have to fork()
before calling os.execlp()
?
回答1:
subprocess: The
subprocess
module allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes.
http://docs.python.org/library/subprocess.html
Usage:
import subprocess
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
process.wait()
print process.returncode
回答2:
You can use subprocess.Popen. There's a few ways to do it:
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
Or, if you don't care what the external program actually does:
cmd = ['/run/myscript', '--arg', 'value']
subprocess.Popen(cmd).wait()
回答3:
The subprocess module has come along way since 2008. In particular check_call and check_output make simple subprocess stuff even easier. The check_*
family of functions are nice it that they raise an exception if something goes wrong.
import os
import subprocess
files = os.listdir('.')
for f in files:
subprocess.check_call( [ 'myscript', f ] )
Any output generated by myscript
will display as though your process produced the output (technically myscript
and your python script share the same stdout). There are a couple of ways to avoid this.
check_call( [ 'myscript', f ], stdout=subprocess.PIPE )
The stdout will be supressed (beware ifmyscript
produces more that 4k of output). stderr will still be shown unless you add the optionstderr=subprocess.PIPE
.check_output( [ 'myscript', f ] )
check_output
returns the stdout as a string so it isnt shown. stderr is still shown unless you add the optionstderr=subprocess.STDOUT
.
回答4:
The os.exec*()
functions replace the current programm with the new one. When this programm ends so does your process. You probably want os.system()
.
回答5:
use spawn
import os
os.spawnlp(os.P_WAIT, 'cp', 'cp', 'index.html', '/dev/null')
回答6:
I use os.system
import os
os.system("pdftoppm -png {} {}".format(path2pdf, os.path.join(tmpdirname, "temp")))
回答7:
this worked for me fine!
shell_command = "ls -l"
subprocess.call(shell_command.split())
来源:https://stackoverflow.com/questions/325463/launch-a-shell-command-with-in-a-python-script-wait-for-the-termination-and-ret