如何使用子流程Popen Python


102

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

但是我想我没有正确地写出来。任何帮助,将不胜感激。谢谢


1
这是Windows机器还是Linux机器?
AAI

Answers:


141

subprocess.Popen 接受参数列表:

from subprocess import Popen, PIPE

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

该文档中甚至有一部分专门用于帮助用户从迁移os.popensubprocess


18
@HansThen shell=True推荐的。
Pierre GM

7
@Lukas Graf既然在代码中这么说。@Alex shell = True在用于处理不受信任的数据时被视为安全风险。聪明的攻击者可以修改输入以访问任意系统命令。例如,通过输入filename.swf; rm -rf /文件名的值。但是,当您对Popen的参数内容不安全时,这只是一个问题。
汉斯,然后

10
@Lukas Graf我强烈怀疑代码段中的示例值是否由不可信的用户提供的数据填充。但是我准备在那个项目上停火。我的意思是,shell=True除了使用不受信任的输入时,没有理由不使用。简单地shell=True说不建议这样做会产生误导。
汉斯,然后

7
@HansThen:PS不要误会我的意思,我不是想在这里处理您的案件。只是您似乎已经意识到与涉及的风险shell=True,但是任何随机用户在此问题上遇到的麻烦都可能没有。这就是为什么我认为重要的是要强调shell=True实际上不建议这样做,除非您确切知道自己在做什么。
卢卡斯·格拉夫

4
@Blender没有人说这很有害-这只是危险。但是除此之外,您的论点根本没有任何意义。Python标准库公开的许多OS功能都有潜在的危险- shutil.rmtree例如。但这与它们是否包含在stdlib中无关。我相信UNIX的理念是“ Unix并非旨在阻止其用户执行愚蠢的事情,因为这也将阻止他们执行聪明的事情。” 在很大程度上也适用于Python。
卢卡斯·格拉夫

9

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

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

2
sh,这很好,但是与子流程的Popen不同。sh与子进程的调用相似。
liuyang15年

-1

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

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

避免使用shell=True而是传递参数列表(例如subprocess.call(['pip', 'install', 'numpy']))。使用用户提供的输入shell=True不安全的(如果用户控制参数,则用户可以运行任意命令),并且由于shell引用规则而使使用更加困难。
克里斯·沃里克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.