Python 2.7 在python中运行具有多个参数的可执行文件

Python 2.7 在python中运行具有多个参数的可执行文件,python-2.7,subprocess,popen,Python 2.7,Subprocess,Popen,我有一个巨大的命令来运行具有多个参数的可执行文件。事情是这样的: ffmpeg.exe -f dshow -y -video_size 1920x1080 -rtbufsize 1404000k -r 30 -i video="HD Video 2 (TC-2000HDMI Card)" -threads 2 -vcodec copy -ar 48000 -ac 1 -acodec pcm_s16le -t 60 c:/output.avi 为此,我使用了subprocess.Popen,但不

我有一个巨大的命令来运行具有多个参数的可执行文件。事情是这样的:

ffmpeg.exe -f dshow -y -video_size 1920x1080 -rtbufsize 1404000k -r 30 -i video="HD Video 2 (TC-2000HDMI Card)" -threads 2 -vcodec copy -ar 48000 -ac 1 -acodec pcm_s16le -t 60 c:/output.avi
为此,我使用了
subprocess.Popen
,但不知道如何使用python 2.7传递这么多参数

我浏览过很多帖子,其中一篇是。我无法使它适用于多个参数

需要相关帮助。

中的示例显示了正确解析复杂命令行以传递到
Popen
的示例:

>>> import shlex, subprocess
>>> command_line = raw_input()
/bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo '$MONEY'"
>>> args = shlex.split(command_line)
>>> print args
['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"]
>>> p = subprocess.Popen(args) # Success!
将其与Python的三重引号结合起来,以允许大多数引号变体,您将得到类似的结果(尚未运行它,很抱歉命令行太长):


.exe
建议您在Windows上,指定要运行的命令的本机界面是字符串,即按原样粘贴字符串:

#!/usr/bin/env python
import subprocess

subprocess.check_call('ffmpeg.exe -f dshow -y -video_size 1920x1080 '
                      '-rtbufsize 1404000k -r 30 '
                      '-i video="HD Video 2 (TC-2000HDMI Card)" '
                      '-threads 2 -vcodec copy -ar 48000 -ac 1 -acodec pcm_s16le '
                      r'-t 60 c:\output.avi')
注意:为了便于阅读,命令被拆分为几个文本,只是为了将其分散在多行上<在Python中,代码>'a''b'文本合并为
'ab'

如果命令不是文字字符串,则使用列表来指定命令可能更方便:

#!/usr/bin/env python
import subprocess

nthreads = 2
width, height = 1920, 1080
filename = r'c:\output.avi'
subprocess.check_call([
        'ffmpeg', '-f', 'dshow', '-y',
        '-video_size', '%dx%d' % (width, height),
        '-rtbufsize', '1404000k', '-r', '30', 
        '-i', 'video=HD Video 2 (TC-2000HDMI Card)',
        '-threads', str(nthreads), '-vcodec', 'copy', '-ar', '48000', '-ac', '1',
        '-acodec', 'pcm_s16le', '-t', '60', 
        filename])
注意:如果只提供了没有路径和文件扩展名的名称,则会自动附加
.exe
。这也使得第二种形式更便于携带


为了避免在Windows路径中转义反斜杠,可以使用原始字符串文字,即,您可以编写
r'C:\User\…'
而不是
'C:\\User\\…'

谢谢@Alex的回复。有什么方法可以在上面的命令中提到我的exe的路径吗?你应该能够在第一个三引号之后和
ffmpeg.exe
之前找到路径。如果路径+可执行文件中有空格,它可能需要在路径+可执行文件周围加上双引号(Windows上可能会有)。顺便说一句,我认为@J.F.Sebastian的答案更好。这个答案适合我的需要,因此我认为它是正确的。不过,这两种方法都可以考虑。谢谢@Sebastian的回复。我对此有两个疑问,-如果我不想硬编码exe和输出文件的路径怎么办。我想将输出存储在我当前的工作目录中。-在上面的示例中,如果exe被放置在我的文件夹的子文件夹中,我如何给出exe的路径cwd@Sid:代码中没有路径。如果ffmpeg的文件夹位于
%PATH%
;将找到exe。如果路径envvar中还没有相应的文件夹,最好将其添加到路径envvar中,但是如果您想直接指定相对于当前工作的路径,那么它很简单
r'relative\PATH'
(即当前目录有
'relative'
子文件夹,而该子文件夹又有
'PATH'
子文件夹)@Sebastian我正在做的是:
mydir=os.getcwd()
我将它附加到exe位置
exename=mydir+r'\3rdparty\ffmpeg-20150907-git-b480f0e-win64-static\bin\ffmpeg.exe'
,我将这个
exename
传递到
子进程。检查调用()
,我希望将此路径作为原始路径处理,但它不是happening@Sid:您是否在我之前的评论中看到
os.getcwd()
?如果您不想将相应的文件夹添加到PATH环境变量中,并且不理解注释中的
r'relative\PATH'
意思,请提出单独的问题(例如,“如何使用相对路径运行
ffmpeg.exe
)。您可以使用
ffmpeg--help
命令进行测试。“它没有发生”信息量不大,请在一个新问题中描述您预期会发生什么以及会发生什么。此外,如果我直接使用exe名称,它仍然不起作用:我收到一个名为“处理错误”的

#!/usr/bin/env python
import subprocess

nthreads = 2
width, height = 1920, 1080
filename = r'c:\output.avi'
subprocess.check_call([
        'ffmpeg', '-f', 'dshow', '-y',
        '-video_size', '%dx%d' % (width, height),
        '-rtbufsize', '1404000k', '-r', '30', 
        '-i', 'video=HD Video 2 (TC-2000HDMI Card)',
        '-threads', str(nthreads), '-vcodec', 'copy', '-ar', '48000', '-ac', '1',
        '-acodec', 'pcm_s16le', '-t', '60', 
        filename])