3 回答
TA贡献1830条经验 获得超9个赞
正如其他人所指出的,实际上只有一个反斜杠,而不是两个。
比使用反斜杠更好的解决方案是省略并将命令行作为列表shell=True传递。ffmpeg
command = [
"ffmpeg", "-i", vid, "-vf", r"select=not(mod(n\,{}))".format(args.nfps),
"-vsync", "-vfr", "-q:v", "2", os.path.join(viddir, "%06d.png"),
]
subprocess.call(command, stderr=subprocess.DEVNULL)
这样您就可以避免使用另一个组件(外壳),并且如果命令的任何部分来自用户,您也可以避免创建安全漏洞。一般来说,最好shell=True尽可能避免。
TA贡献2039条经验 获得超7个赞
只有一个反斜杠。您可以通过 确认这一点print(command)
。您看到两个反斜杠的原因是 pdb 在代码中将值显示为 Python 字符串,反斜杠通常需要在 Python 的字符串中进行转义 — 事实上,您不应该在代码中编写,您应该"…\,…"
编写"…\\,…"
. 但由于\,
不是已知的转义序列,Python 可以这么说“让它滑动”。
但请注意,通常在\
字符串内部使用可能具有特殊含义,如果您想使用文字反斜杠,则需要将其转义(即 write \\
)或者您需要使用原始字符串文字 ( r"…"
)。
TA贡献1776条经验 获得超12个赞
如果你想在字符串中包含文字反斜杠,那么你的选择是使用原始字符串(注意r开头之前的'):
>>> s = r'foo\bar'
>>> print(s)
foo\bar
或者使用额外的反斜杠引用反斜杠:
>>> s = 'foo\\bar'
>>> print(s)
foo\bar
查看您拥有的内容的最佳方式是使用print.
请注意,如果您不使用print,而只是通过在交互式会话中键入变量名称(包括在 中)来显示字符串的内容pdb,那么这将等同于print(repr(s))- 换句话说,它打印的内容本质上是表达式需要在 Python 源代码中使用以恢复原始字符串。因此,这将包括额外的反斜杠,如上所示:
>>> s
'foo\\bar'
>>> print(repr(s))
'foo\\bar'
但这并不意味着该字符串实际上包含两个反斜杠。
添加回答
举报