在 python 脚本中启动 shell 命令,等待终止并返回到脚本
-
11-07-2019 - |
题
我有一个 python 脚本,必须为目录中的每个文件启动 shell 命令:
import os
files = os.listdir(".")
for f in files:
os.execlp("myscript", "myscript", f)
这对于第一个文件来说效果很好,但是在“myscript”命令结束后,执行停止并且不会返回到 python 脚本。
我能怎么做?我一定要吗 fork()
前 calling os.execlp()
?
解决方案
子流程:这
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()
subprocess 模块自 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 的输出)。除非您添加选项,否则仍会显示 stderrstderr=subprocess.PIPE
.check_output( [ 'myscript', f ] )
check_output
将标准输出作为字符串返回,因此不会显示。除非您添加选项,否则仍会显示 stderrstderr=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())
不隶属于 StackOverflow