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

Python 使用格式在字符串中添加反斜杠,python,string,literals,Python,String,Literals,我在mod之后添加了一个反斜杠,我需要使用subprocess执行它,但在打印命令名时,它使用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)

我在mod之后添加了一个反斜杠,我需要使用subprocess执行它,但在打印命令名时,它使用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"
我试图在格式中添加反斜杠,但后来添加了更多反斜杠


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

如果要在字符串中包含文字反斜杠,则您可以选择使用原始字符串(请注意,在开头
'之前的
r
):

或者使用额外的反斜杠引用反斜杠:

>>> s = 'foo\\bar'
>>> print(s)
foo\bar
查看所拥有内容的最佳方法是使用
print

请注意,如果不使用
print
,只需在交互式会话(包括在
pdb
中)中键入变量名即可显示字符串的内容,则这相当于
print(repr(s))
-换句话说,它打印的基本上是Python源代码中需要使用的表达式,以便恢复原始字符串。因此,这将包括额外的反斜杠,如上所示:

>>> s
'foo\\bar'

>>> print(repr(s))
'foo\\bar'

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

如果您想在字符串中包含文字反斜杠,那么您可以选择使用原始字符串(请注意开头
之前的
r
):

或者使用额外的反斜杠引用反斜杠:

>>> s = 'foo\\bar'
>>> print(s)
foo\bar
查看所拥有内容的最佳方法是使用
print

请注意,如果不使用
print
,只需在交互式会话(包括在
pdb
中)中键入变量名即可显示字符串的内容,则这相当于
print(repr(s))
-换句话说,它打印的基本上是Python源代码中需要使用的表达式,以便恢复原始字符串。因此,这将包括额外的反斜杠,如上所示:

>>> s
'foo\\bar'

>>> print(repr(s))
'foo\\bar'

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

只有一个反斜杠。您可以通过
打印(命令)
进行确认。您看到两个反斜杠的原因是pdb将值显示为代码中的Python字符串,反斜杠通常需要在Python中的字符串中转义-事实上,您不应该在代码中编写
“…\,…”
,您应该编写
“…\ \,…”
。但是由于
\,
不是一个好消息,可以这么说,Python“让它溜走了”


但是要注意,通常在字符串中使用
\
可能有特殊的含义,如果您想使用文字反斜杠,您要么需要将其转义(即写入
\
),要么需要使用原始字符串文字(
r“…”
)。

只有一个反斜杠。您可以通过
打印(命令)
进行确认。您看到两个反斜杠的原因是pdb将值显示为代码中的Python字符串,反斜杠通常需要在Python中的字符串中转义-事实上,您不应该在代码中编写
“…\,…”
,您应该编写
“…\ \,…”
。但是由于
\,
不是一个好消息,可以这么说,Python“让它溜走了”


但是要注意,通常在字符串中使用
\
可能有特殊的含义,如果您想使用文本反斜杠,您要么需要将其转义(即写入
\
),要么需要使用原始字符串文本(
r“…”
)。

正如其他人所指出的,实际上只有一个反斜杠,而不是两个

比使用反斜杠更好的解决方案是省略
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),如果命令的任何部分来自用户,也可以避免创建安全漏洞。一般来说,最好尽可能避免使用
shell=True

正如其他人所指出的,实际上只有一个反斜杠,而不是两个

比使用反斜杠更好的解决方案是省略
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),如果命令的任何部分来自用户,也可以避免创建安全漏洞。一般来说,如果可能的话,最好避免使用
shell=True

请用您需要的输出更新您的问题。请用您需要的输出更新您的问题。是的,您是正确的,在打印时,它需要一个反斜杠,但问题是双反斜杠字符串进入子流程调用,而子流程调用不会按照要求执行。“我怎么才能逃脱呢?”AshutoshMishra没有双反斜杠字符串。这纯粹是当您键入
command
时它的表示方式。你试过按康拉德的建议打印(命令)
吗?@AshutoshMishra不,绝对没有。你怎么会这么想这就是说,您显然在使用Windows,其中肯定是
shell=True
。使用
shell=False
并将单独的参数传递给
子流程。调用
函数,而不是命令字符串。@sabik True,但它在其他系统上也不像在Windows上那样有害,因为使用的shell(在某种程度上)指定得更好。对于某些命令,使用
shell=True
比创建中间脚本文件或通过
sh-c
传递参数要容易得多…。也就是说,它的用处是有限的。@KonradRudolph-是的,如果您要创建一个中间脚本文件或显式调用
sh-c
,那么您最好使用
shell=True
;但是,在大多数情况下,您使用Python生成的参数列表调用一个命令,在w