在python脚本中使用启动shell命令,等待终止并返回脚本
我有一个python脚本,它必须为dir中的每个文件启动shell命令:在python脚本中使用启动shell命令,等待终止并返回脚本,python,subprocess,popen,os.execl,Python,Subprocess,Popen,Os.execl,我有一个python脚本,它必须为dir中的每个文件启动shell命令: import os files = os.listdir(".") for f in files: os.execlp("myscript", "myscript", f) 这对于第一个文件很好,但是在“myscript”命令结束后,执行停止,不再返回python脚本 我该怎么办?在调用os.execlp()之前,我是否必须fork()?使用os.exec*()函数替换当前程序。当这个程序结束时,你的过程也会结
import os
files = os.listdir(".")
for f in files:
os.execlp("myscript", "myscript", f)
这对于第一个文件很好,但是在“myscript”命令结束后,执行停止,不再返回python脚本
我该怎么办?在调用os.execlp()之前,我是否必须fork()
?使用os.exec*()
函数替换当前程序。当这个程序结束时,你的过程也会结束。您可能需要os.system()
子流程:子流程
模块
允许您生成新进程,
连接到他们的输入/输出/错误
并获取其返回代码
用法:
import subprocess
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
process.wait()
print process.returncode
使用繁殖
import os
os.spawnlp(os.P_WAIT, 'cp', 'cp', 'index.html', '/dev/null')
你可以用。有几种方法可以做到这一点:
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.*
函数系列很好,如果出现问题,它们会引发异常
import os
import subprocess
files = os.listdir('.')
for f in files:
subprocess.check_call( [ 'myscript', f ] )
由myscript
生成的任何输出都将显示为进程生成了输出(从技术上讲myscript
和python脚本共享相同的标准输出)。有几种方法可以避免这种情况
检查调用(['myscript',f],stdout=subprocess.PIPE)
stdout将被抑制(如果
产生的输出超过4k,请小心)。除非添加选项myscript
,否则stderr仍将显示stderr=subprocess.PIPE
检查输出(['myscript',f])
将标准输出作为字符串返回,因此不会显示。除非添加选项check\u output
,否则stderr仍将显示stderr=subprocess.STDOUT
import os
os.system("pdftoppm -png {} {}".format(path2pdf, os.path.join(tmpdirname, "temp")))
这对我很管用
shell\u命令=“ls-l”
子进程调用(shell_命令.split())
@Luke Stanley:你的问题不清楚,但我会试一试。与手动使用subprocess.Popen
相比,使用subprocess.check.*
函数调用外部二进制文件更容易。特别是,您不需要处理wait()
,communicate()
,return\u code
,等等。您也不需要担心像悬垂的管道使可执行文件停滞这样的问题。当涉及到与外部二进制文件交互时,check*
函数没有太大帮助,但对于大多数用例,结果更短,更不容易出错。您可以使用subprocess.DEVNULL
或open(os.DEVNULL,'r+b')
要忽略输入/输出,而不是subprocess.PIPE,以避免可能出现的死锁,我认为作为公认的答案,这应该至少包含与@Harley相同数量的细节。这更多的是个人要求,但我认为更新的文档更好地呈现信息。您可以改为链接到该文档的2.7版本吗?该文档的较新版本位于。remove stdout=PIPE如果子程序产生足够的输出(在Linux上约为65KB),它可能会挂起脚本shell=True
是不必要的。如果没有shell=True,则会在python 2.7上引发异常。。。文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py”,第1335行,在执行子进程引发子进程异常OSError:[Errno 2]中,对于p.stdout:中的行,没有这样的文件或目录,可能会由于预读而延迟行的输出。您可以对iter中的行使用(p.stdout.readline,b''):打印行,
(注意:末尾是逗号)。删除第二个示例中的stdout=管道;它可能会挂起脚本。如果不需要非零返回的codeos的异常,也可以使用subprocess.call()
。system()在安全性方面存在很大问题,以至于许多C库都直接删除了这个标准C函数。应改用shell=False的subprocess.Popen()