【问题标题】:Running an executable with multiple parameters in python在python中运行具有多个参数的可执行文件
【发布时间】:2016-01-25 09:50:01
【问题描述】:

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

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。我无法让它适用于多个参数。

在这方面需要帮助。

【问题讨论】:

    标签: python-2.7 subprocess popen


    【解决方案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"""))
    

    【讨论】:

    • 感谢@Alex 的回复。有没有办法可以在上面的命令中提到我的 exe 的路径
    • 您应该能够找到第一个三引号之后和ffmpeg.exe 之前的路径。如果路径中有空格,它可能需要在路径+可执行文件周围加上双引号(并且可能会在 Windows 上)。
    • 顺便说一句,我认为@J.F.塞巴斯蒂安的答案更好。
    • 这个答案适合我的需要,因此认为它是正确的。不过这两种方法都可以考虑。
    【解决方案2】:

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

    【讨论】:

    • 感谢@Sebastian 的回复。我对此有 2 个疑问, - 如果我不想硬编码 exe 和输出文件的路径怎么办。我想将输出存储在我当前的工作目录中。 - 如果 exe 放在我的 cwd 的子文件夹中,我如何在上面的示例中给出我的 exe 的路径
    • @Sid:代码中没有路径。如果ffmpeg的文件夹在%PATH%;将找到该exe。最好将相应的文件夹添加到 PATH 环境变量中,如果它不存在,但如果您想直接指定相对于当前工作的路径,那么它很简单 r'relative\path'(即,当前目录有 'relative' 子文件夹这又具有'path' 子文件夹)。
    • @Sebastian 这是我正在做的事情:mydir = os.getcwd(),我将它附加到 exe 位置exename = mydir + r'\3rdparty\ffmpeg-20150907-git-b480f0e-win64-static\bin\ffmpeg.exe',我将这个exename 传递给subprocess.check_call(),我想要这条路径被作为原始处理,但它没有发生
    • @Sid:你在我之前的评论中看到os.getcwd() 吗?如果您不想将相应的文件夹添加到 PATH 环境变量中,并且您不理解注释中 r'relative\path' 的含义,请提出单独的问题(例如,“如何使用相对路径运行 ffmpeg.exe”)。您可以使用ffmpeg --help 命令进行测试。 “它没有发生” 信息量不大,请在一个新问题中描述您期望发生什么以及会发生什么。
    • 另外,如果我直接使用 exe 名称,它仍然无法正常工作:我收到了 CalledProcessError
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 2013-05-21
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多