Python子进程参数

use*_*906 9 python subprocess command-line-arguments

例如我正在使用ffplay并希望运行此命令-bufsize[:stream_specifier] integer (output,audio,video)

目前我有这个:

subprocess.call(["ffplay", "-vn", "-nodisp","-bufsize 4096", "%s" % url])
Run Code Online (Sandbox Code Playgroud)

但这说它无效.

Abe*_*lus 15

正如JBernardo在评论中提到的那样,将"-bufsize 4096"论证分成两部分,"-bufsize", "4096".subprocess.callshell=False(默认值)一起使用时,每个参数都需要分开.您还可以指定shell=True整个命令并将其作为单个字符串提供,但由于潜在的安全漏洞,建议不要这样做.

您不应该在任何地方使用字符串格式"%s" % url.如果url是字符串,则直接传递,否则调用str(url)以获取字符串表示.


Fab*_*zio 5

这是要走的路:

url = 'http://www.whatever.com'
cmd = 'ffplay -vn -nodisp -bufsize 4096 '.split()
subprocess.call(cmd + [str(url)], shell=False)
Run Code Online (Sandbox Code Playgroud)

  • 我的观点是,这不是“前进的道路”,因为它相当脆弱。 (3认同)
  • 如果“url”包含空格怎么办? (2认同)

Mor*_*ode 5

虽然使用shlex.split()对于您的用例来说是多余的,但许多评论似乎都在询问在 CLI 允许您传递包含空格的带引号的字符串(即git commit -m "Commit message here")的情况下在参数中使用空格。

这是一个快速的 python 函数,可用于运行包含带空格参数的命令:

import shlex, subprocess

def run_command( command ):
    subprocess.call(shlex.split(command))
Run Code Online (Sandbox Code Playgroud)