【问题标题】:Difference between single and double quotes in subprocess [Python 3.4]子进程中单引号和双引号之间的区别[Python 3.4]
【发布时间】:2016-07-08 20:34:39
【问题描述】:

我在 Windows Server 12 中使用 Python 3.4,并且我有一些 Python 代码可以执行下面的 ffmpeg 命令:

ffmpeg -i input.mp4 -vf select='not(mod(n\,30)),setpts=N/((30)*TB)' -c:v rawvideo -pix_fmt uyvy422 -y output.avi

我使用以下代码执行外部命令:

try:
    output = subprocess.check_output(command, stderr=subprocess.STDOUT, shell=True)
except subprocess.CalledProcessError as exc:
    print ("Command %s failed with error code" % command, exc.returncode, exc.output, file=sys.stderr)

当我传递用单引号括起来的命令时,它会成功运行命令:

command = 'ffmpeg -i input.mp4 -vf select="not(mod(n\,30)),setpts=N/((30)*TB)" -c:v rawvideo -pix_fmt uyvy422 -y output.avi'

当我将命令作为用双引号括起来的字符串传递时,它会失败:

command = "ffmpeg -i input.mp4 -vf select='not(mod(n\,30)),setpts=N/((30)*TB)' -c:v rawvideo -pix_fmt uyvy422 -y output.avi"

错误信息如下:

[Eval @ 0000000eaf2fe040] Invalid chars ',setpts=N/((30)*TB)' at the end of expression 'not(mod(n,30)),setpts=N/((30)*TB)'  
[Parsed_select_0 @ 0000000eb0d27ca0] Error while parsing expression 'not(mod
(n,30)),setpts=N/((30)*TB)'  
[AVFilterGraph @ 0000000eb0d0a5a0] Error initializing filter 'select' with args 'not(mod(n\\,30)),setpts=N/((30)*TB)'  
Error opening filters!"

因此,当使用双引号时,作为setpts=N/((30)*TB) 选项一部分的斜杠/ 似乎没有正确解释,而使用双引号则没有问题。请注意,当我直接从命令提示符运行它们时,这两个命令(在选择选项中带有双引号或单引号)都可以正常工作。 但是,我看到很多人说从技术角度来看,单引号和双引号没有区别,例如

斜杠解析是否依赖于字符串周围的引号,或者这只是我正在运行的可执行文件特有的行为?

【问题讨论】:

    标签: python ffmpeg subprocess double-quotes single-quotes


    【解决方案1】:

    好问题,我在 Blender 中使用 Python 3.5.0 时遇到了同样的问题。 当我写的时候:

    addr_cal.append(addr + "calibration")
    sock_cal.connect(addr_cal[0])
    

    它不起作用(Errno 11,连接被拒绝),但是:

    addr_cal.append(addr + 'calibration')
    

    完美运行。互联网上到处都有人说这只是风格问题,但显然不是。

    【讨论】:

      【解决方案2】:

      我想问题不在 Python 中,而是在子进程或更低的某个地方......双引号具有命令行含义 - 它们允许在参数中发送空格或非字母字符。也许字符串中的单引号会导致失败?

      试试 command = "ffmpeg -i input.mp4 -vf select=\"not(mod(n\,30)),setpts=N/((30)*TB)\" -c:v rawvideo -pix_fmt uyvy422 -y output.avi"

      \" 代替 ' 在字符串中)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-27
        • 2018-08-29
        • 2021-08-29
        • 2016-08-31
        相关资源
        最近更新 更多