如何使用 subprocess popen Python [重复]
- 2025-01-17 09:23:00
- admin 原创
- 84
问题描述:
由于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:
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
。
解决方案 2:
在最近的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:
如何将 shell 命令分解为一系列参数可能并不明显,尤其是在复杂的情况下。shlex.split()
可以对参数进行正确的标记化(我使用 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
解决方案 4:
使用sh,它会让事情变得简单得多:
import sh
print sh.swfdump("/tmp/filename.swf", "-d")
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD