我有一个 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_callcheck_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())

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top