代码之家  ›  专栏  ›  技术社区  ›  Athena Vinod R

python行继续会导致deprecationwarning

  •  0
  • Athena Vinod R  · 技术社区  · 6 年前

    在python 3.6.5中,这很好地工作:

    command = "ffmpeg -i {0} -vsync 0 -q:v 2 -vf select=\"eq(pict_type\,PICT_TYPE_I)\" -r 30 {1}/frame%03d.jpg".format(file_path, output_path)
    

    这显然是一条很长的线,所以我用了一个连续的线:

    command = "ffmpeg -i {0} -vsync 0 -q:v 2 -vf select=\"eq(pict_type\,PICT_TYPE_I)\" -r 30 {1}/frame%03d.jpg"\
        .format(file_path, output_path)
    

    但是,在启动时,这会生成一个 DeprecationWarning :

     DeprecationWarning: invalid escape sequence \,
      command = "ffmpeg -i {0} -vsync 0 -q:v 2 -vf select=\"eq(pict_type\,PICT_TYPE_I)\" -r 30 {1}/frame%03d.jpg"\
    

    这确实 然而,

    command = "foo {0} bar {1}"\
        .format(file_path, output_path)
    

    我在项目的其余部分都使用了行连续性;没有一个可以导致 折旧警告 . 其他问题如 this one 提到这个警告,但我找不到继续字符。

    什么导致了这个警告,为什么它只出现在这个非常狭小的案例中?

    编辑 :这与行继续无关。这个错误只在某些时候出现在我身上,这与姜戈的错误有关。 runserver . 第一次 运行服务器 运行,不报告错误。但如果更改导致重新加载,则在重新加载程序运行时报告错误。

    2 回复  |  直到 6 年前
        1
  •  4
  •   abarnert    6 年前

    这与您的行继续无关,它与使用 \, 作为字符串中的转义序列。

    警告明确包括 \ :

    DeprecationWarning: invalid escape sequence \,
    

    这就是为什么后面的示例不发出警告:因为字符串没有 \ 或其他无法识别的转义序列。

    如文档中所述 String and Byte literals :

    在版本3.6中更改:无法识别的转义序列产生 DeprecationWarning . 在将来的Python版本中,它们将是 SyntaxError .

    这一变化在 What's New in Python 3.6 ,链接到 issue #27364 ,链接到 an earlier discussion on the -dev mailing list .

    传统上,python在字符串文本中允许不可识别的转义序列,并且只处理它们,就好像它们不是转义序列一样,所以 \ 字面意思是反斜杠和逗号,因为这样在调试器中打印字符串时更容易看到出错的地方。

    但是这会导致各种各样的混乱,特别是对于Windows用户(他们可以摆脱 'C:\Spam' , 'C:\spam' 'C:\Vikings' ,但在 'C:\vikings' ,对于来自大量使用C风格转义规则的语言的人(其中 \ 这意味着大多数C编译器只会生成一个警告,这大概就是为什么您现在会收到一个警告。

        2
  •  2
  •   nosklo    6 年前

    尝试使用命令列表:

    command = [
        "ffmpeg",
        "-i", file_path,
        "-vsync", "0", 
        "-q:v", "2",
        "-vf", 'select="eq(pict_type,PICT_TYPE_I)"',
        "-r", "30", 
        os.path.join(output_path, "frame%03d.jpg"),
    ]
    

    那就不用了 shell=True :

    subprocess.run(command)
    

    通过这样做,您有多种优势:

    1. 你是 从引用中解脱并逃离地狱 -您不必添加引号或转义任何内容。空格不再是分隔符,参数将按列表中的方式传递。
    2. 你不必使用字符串插值( .format )因为您可以将参数单独传递给列表。
    3. 通过不使用shell,您可以避免无缘无故地执行一个额外的过程——当您可以直接运行命令时,为什么要执行shell来运行您的命令?