如何使用subprocess popen Python

Stu*_*Cat 86 python subprocess popen

由于os.popen被subprocess.popen取代,我想知道如何转换

os.popen('swfdump /tmp/filename.swf/ -d')
Run Code Online (Sandbox Code Playgroud)

到subprocess.popen()

我试过了:

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

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

Ble*_*der 119

subprocess.Popen 获取参数列表:

from subprocess import Popen, PIPE

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

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

  • @HansThen`hell = True`是****不推荐**. (15认同)
  • @Lukas Graf从代码片段中我强烈怀疑这是一个示例值,由不受信任的用户提供的数据填充.但我准备在该项目上停战.我的观点更多的是没有理由不使用`shell = True`,除非使用__untrusted__输入.简单地说明不推荐使用`shell = True`会产生误导. (9认同)
  • @Lukas Graf因为它在代码中这么说.@Alex shell = True用于处理不受信任的数据时被视为安全风险.聪明的攻击者可以修改输入以访问任意系统命令.例如,输入`filename.swf; rm -rf /`表示文件名的值.然而,当你对Popen的论证内容不安全时,这只是一个问题. (7认同)
  • @HansThen:PS别误会我的意思,我不是想在这里找到你的案子.只是你似乎意识到`shell = True`所涉及的风险,但任何随机用户都可能不会遇到这个问题.这就是为什么我认为重要的是强调事实上不建议使用`shell = True`,除非你确切知道你在做什么. (7认同)
  • @Blender没有人说这是有害的 - 这只是危险的.但除此之外,你的论点根本没有意义.Python标准库暴露的许多OS函数都具有潜在的危险性 - 以"shutil.rmtree"为例.但这与它们是否包含在stdlib中无关.我相信_"Unix的UNIX哲学并不是为了阻止用户做蠢事,因为这也会阻止他们做一些聪明的事情."_也适用于Python. (3认同)

小智 12

如何将 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()
Run Code Online (Sandbox Code Playgroud)

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


amo*_*fat 9

使用sh,它会让事情变得更容易:

import sh
print sh.swfdump("/tmp/filename.swf", "-d")
Run Code Online (Sandbox Code Playgroud)

  • sh非常棒,但读者要小心,它不支持Windows (18认同)
  • sh,很好,但是和子进程的Popen不一样。sh 与调用子进程类似。 (2认同)

Mai*_*Hai 6

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

新的 subprocess.Popen()

import subprocess
subprocess.Popen('ls -la', shell=True)
Run Code Online (Sandbox Code Playgroud)

它的论点:

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)
Run Code Online (Sandbox Code Playgroud)

简而言之,新的Popen包括被分成 4 个独立的旧的所有功能popen

旧的popen

Method  Arguments
popen   stdout
popen2  stdin, stdout
popen3  stdin, stdout, stderr
popen4  stdin, stdout and stderr
Run Code Online (Sandbox Code Playgroud)

您可以在Stack Abuse-Robert Robinson 中获得更多信息。感谢他的奉献。