如何使用子进程 popen Python

由于 os.popen正在被 subprocess.popen所取代,我想知道如何进行转换

os.popen('swfdump /tmp/filename.swf/ -d')

subprocess.popen()

我试过:

subprocess.Popen("swfdump /tmp/filename.swf -d")
subprocess.Popen("swfdump %s -d" % (filename))  # NOTE: filename is a variable
# containing /tmp/filename.swf

但是我想我没有把这个写出来。任何帮助都会很感激。谢谢

505845 次浏览

subprocess.Popen接受一系列参数:

from subprocess import Popen, PIPE


process = Popen(['swfdump', '/tmp/filename.swf', '-d'], stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()

甚至还有一个 文件部分专门帮助用户从 os.popen迁移到 subprocess

使用 ,它会使事情变得容易得多:

import sh
print sh.swfdump("/tmp/filename.swf", "-d")

以最简单的方式使用 Subprocess! !

import subprocess
cmd = 'pip install numpy'.split()  #replace with your command
subprocess.call(cmd)

在最近的 Python 版本中,subprocess有了很大的变化,它提供了一个全新的类 Popen来处理 os.popen1|2|3|4

新的 subprocess.Popen()

import subprocess
subprocess.Popen('ls -la', shell=True)

它的论点是:

subprocess.Popen(args,
bufsize=0,
executable=None,
stdin=None, stdout=None, stderr=None,
preexec_fn=None, close_fds=False,
shell=False,
cwd=None, env=None,
universal_newlines=False,
startupinfo=None,
creationflags=0)

简单地说,新的 Popen包括了所有的功能,这些功能被分成4个独立的旧的 popen

旧的 popen:

Method  Arguments
popen   stdout
popen2  stdin, stdout
popen3  stdin, stdout, stderr
popen4  stdin, stdout and stderr

你可以在 堆栈虐待-罗伯特 · 罗宾逊得到更多的信息。感谢他的奉献。

如何将 shell 命令分解为一系列参数可能并不明显,特别是在复杂的情况下。shlex.split()可以对 args 进行正确的标记化(我使用的是 Blender 的调用示例) :

import shlex
from subprocess import Popen, PIPE
command = shlex.split('swfdump /tmp/filename.swf/ -d')
process = Popen(command, stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()

Https://docs.python.org/3/library/subprocess.html