猿问

使用格式在字符串中添加反斜杠

我在 mod 之后添加了一个反斜杠,我需要使用子进程执行它,但是在打印命令名称时它使用 pdb 显示双反斜杠。


command = "ffmpeg -i {} -vf 'select=not(mod(n\,{}))' -vsync -vfr -q:v 2 {} 2>NUL".format(vid, args.nfps, viddir + "/%06d.png")

subprocess.call(command,shell=True)

(Pdb) command

"ffmpeg -i /home/ashutosh/Music/2020-07-24/DV1/0001.mp4 -vf 'select=not(mod(n\\,60))' -vsync -vfr -q:v 2 /home/ashutosh/Music/2020-07-24/DV1/0001/%06d.png 2>NUL"

输出应该像


"ffmpeg -i /home/ashutosh/Music/2020-07-24/DV1/0001.mp4 -vf 'select=not(mod(n\,60))' -vsync -vfr -q:v 2 /home/ashutosh/Music/2020-07-24/DV1/0001/%06d.png 2>NUL"

我试图在格式中添加反斜杠,但随后添加了更多反斜杠。


无论如何要对此进行编码,以便我得到一个反斜杠。


达令说
浏览 152回答 3
3回答

慕标琳琳

正如其他人所指出的,实际上只有一个反斜杠,而不是两个。比使用反斜杠更好的解决方案是省略并将命令行作为列表shell=True传递。ffmpegcommand = [    "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尽可能避免。

largeQ

只有一个反斜杠。您可以通过 确认这一点print(command)。您看到两个反斜杠的原因是 pdb 在代码中将值显示为 Python 字符串,反斜杠通常需要在 Python 的字符串中进行转义 — 事实上,您不应该在代码中编写,您应该"…\,…"编写"…\\,…". 但由于\,不是已知的转义序列,Python 可以这么说“让它滑动”。但请注意,通常在\字符串内部使用可能具有特殊含义,如果您想使用文字反斜杠,则需要将其转义(即 write \\)或者您需要使用原始字符串文字 ( r"…")。

叮当猫咪

如果你想在字符串中包含文字反斜杠,那么你的选择是使用原始字符串(注意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'但这并不意味着该字符串实际上包含两个反斜杠。
随时随地看视频慕课网APP

相关分类

Python
我要回答