如何使用子流程popen Python

如何使用子流程popen Python,python,subprocess,popen,Python,Subprocess,Popen,由于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 va

由于
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

但我想我没有把这写清楚。任何帮助都将不胜感激。谢谢

子流程。Popen
获取参数列表:

from subprocess import Popen, PIPE

process = Popen(['swfdump', '/tmp/filename.swf', '-d'], stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()
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)
甚至还有一个专门用于帮助用户从
os.popen
迁移到
子流程
的工具。使用它,事情会变得简单得多:

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

以最简单的方式使用子流程

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

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

新的
subprocess.Popen()

其论点:

from subprocess import Popen, PIPE

process = Popen(['swfdump', '/tmp/filename.swf', '-d'], stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()
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()


@HansThen
shell=True
不推荐使用。@Lukas Graf,因为它在代码中这样说@Alex shell=True用于处理不受信任的数据时被视为存在安全风险。聪明的攻击者可以修改输入以访问任意系统命令。例如,通过输入
filename.swf;rm-rf/
用于文件名的值。然而,这只是一个问题,当您对Popen的参数的内容不安全时。@Lukas Graf(来自代码片段),我强烈怀疑这是一个示例值,由不受信任的用户提供的数据填充。但我准备就此项目宣布休战。我的观点是没有理由不使用
shell=True
,除非使用不受信任的输入。简单地说不建议使用
shell=True
,这是一种误导。@hanssen:P.S.别误会我的意思,我不想在这里讨论你的案子。只是您似乎意识到了与
shell=True
相关的风险,但任何偶然遇到这个问题的用户可能都不会意识到。这就是为什么我认为强调事实上不建议使用
shell=True
,这一点很重要,除非你确切知道自己在做什么。@Blender没有人说它有害——它只是危险而已。但除此之外,你的论点毫无意义。Python标准库公开的许多操作系统函数都有潜在的危险,例如
shutil.rmtree
。但这与它们是否包含在stdlib中无关。我相信UNIX的理念“UNIX的设计目的不是阻止用户做愚蠢的事情,因为这也会阻止他们做聪明的事情。”这在很大程度上也适用于Python.sh,这很好,但与subprocess的Popen不同。sh与子进程的调用类似。这是Windows机器还是Linux机器?