在python脚本中使用启动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*()函数替换当前程序。当这个程序结束时,你的过程也会结

我有一个python脚本,它必须为dir中的每个文件启动shell命令:

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将被抑制(如果
    myscript
    产生的输出超过4k,请小心)。除非添加选项
    stderr=subprocess.PIPE
    ,否则stderr仍将显示
  • 检查输出(['myscript',f])

    check\u output
    将标准输出作为字符串返回,因此不会显示。除非添加选项
    stderr=subprocess.STDOUT
    ,否则stderr仍将显示
我使用操作系统

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