为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

达令说 2023-06-20 10:19:53
我在 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"我试图在格式中添加反斜杠,但随后添加了更多反斜杠。无论如何要对此进行编码,以便我得到一个反斜杠。
查看完整描述

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尽可能避免。


查看完整回答
反对 回复 2023-06-20
?
largeQ

TA贡献2039条经验 获得超7个赞

只有一个反斜杠。您可以通过 确认这一点print(command)。您看到两个反斜杠的原因是 pdb 在代码中将值显示为 Python 字符串,反斜杠通常需要在 Python 的字符串中进行转义 — 事实上,您不应该在代码中编写,您应该"…\,…"编写"…\\,…". 但由于\,不是已知的转义序列,Python 可以这么说“让它滑动”。

但请注意,通常在\字符串内部使用可能具有特殊含义,如果您想使用文字反斜杠,则需要将其转义(即 write \\)或者您需要使用原始字符串文字 ( r"…")。


查看完整回答
反对 回复 2023-06-20
?
叮当猫咪

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'

但这并不意味着该字符串实际上包含两个反斜杠。


查看完整回答
反对 回复 2023-06-20
  • 3 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信