我有一个 python 脚本,它必须为目录中的每个文件启动一个 shell 命令:
import os
files = os.listdir(".")
for f in files:
os.execlp("myscript", "myscript", f)
这适用于第一个文件,但在“myscript”命令结束后,执行停止并且不会返回到 python 脚本。
我能怎么做?我必须fork()
以前calling os.execlp()
吗?
我有一个 python 脚本,它必须为目录中的每个文件启动一个 shell 命令:
import os
files = os.listdir(".")
for f in files:
os.execlp("myscript", "myscript", f)
这适用于第一个文件,但在“myscript”命令结束后,执行停止并且不会返回到 python 脚本。
我能怎么做?我必须fork()
以前calling os.execlp()
吗?
subprocess:该
subprocess
模块允许您生成新进程,连接到它们的输入/输出/错误管道,并获取它们的返回码。
http://docs.python.org/library/subprocess.html
用法:
import subprocess
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
process.wait()
print process.returncode
您可以使用subprocess.Popen
. 有几种方法可以做到:
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
或者,如果您不关心外部程序的实际作用:
cmd = ['/run/myscript', '--arg', 'value']
subprocess.Popen(cmd).wait()
自 2008 年以来,子流程模块已经出现。特别是check_call
让check_output
简单的子流程变得更容易。函数族check_*
很好,如果出现问题,它们会引发异常。
import os
import subprocess
files = os.listdir('.')
for f in files:
subprocess.check_call( [ 'myscript', f ] )
生成的任何输出myscript
都将显示为好像您的进程生成了输出(从技术上讲myscript
,您的 python 脚本共享相同的标准输出)。有几种方法可以避免这种情况。
check_call( [ 'myscript', f ], stdout=subprocess.PIPE )
myscript
产生超过 4k 的输出)。除非您添加选项,否则仍将显示 stderr stderr=subprocess.PIPE
。check_output( [ 'myscript', f ] )
check_output
将标准输出作为字符串返回,因此不显示。除非您添加选项,否则仍会显示 stderr stderr=subprocess.STDOUT
。这些os.exec*()
功能用新的程序替换当前程序。当这个程序结束时,您的进程也会结束。你可能想要os.system()
.
使用产卵
import os
os.spawnlp(os.P_WAIT, 'cp', 'cp', 'index.html', '/dev/null')
我使用 os.system
import os
os.system("pdftoppm -png {} {}".format(path2pdf, os.path.join(tmpdirname, "temp")))
这对我有用!
shell_command = "ls -l"
subprocess.call(shell_command.split())