在python中运行带有多个参数的可执行文件

时间:2015-10-26 10:22:12

标签: 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,但不知道如何使用python 2.7传递这么多参数

我经历了很多帖子,其中一个是this。我不能让它适用于多个论点。

需要帮助。

2 个答案:

答案 0 :(得分:1)

来自subprocess.Popen的示例显示了正确解析复杂命令行以传递给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的三重引用相结合以允许大多数引用变种会给你这样的东西(没有运行它,抱歉长命令行):

import shlex, subprocess
p = subprocess.Popen(slex.split("""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"""))

答案 1 :(得分:1)

.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')

注意:该命令被拆分为多个文字,只是为了便于阅读,将其分布在多行上。 'a' 'b'文字在Python中合并为'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\\...'