由于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
但我想我没有正确地写出来。任何帮助,将不胜感激。感谢
答案 0 :(得分:112)
subprocess.Popen
获取参数列表:
from subprocess import Popen, PIPE
process = Popen(['swfdump', '/tmp/filename.swf', '-d'], stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()
甚至有section of the documentation致力于帮助用户从os.popen
迁移到subprocess
。
答案 1 :(得分:9)
使用sh,它会让事情变得更轻松:
import sh
print sh.swfdump("/tmp/filename.swf", "-d")
答案 2 :(得分:4)
在最近的 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
您可以在 Stack Abuse - Robert Robinson 中获得更多信息。感谢他的付出。
答案 3 :(得分:1)
如何将 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()
答案 4 :(得分:-1)
以最简单的方式使用子流程!
import subprocess
cmd = 'pip install numpy'.split() #replace with your command
subprocess.call(cmd)