如何在不使用原始字符串的情况下将 `sed` 命令传递给 `popen`?

How can I pass a `sed` command to `popen` without using a raw string?

如何在不使用原始字符串的情况下将 sed 命令传递给 popen

当我以列表形式将 sed 命令传递给 popen 时,出现错误:unterminated address regex(参见第一个示例)

>>> COMMAND = ['sed', '-i', '-e', "$amystring", '/home/map/myfile']
>>> subprocess.Popen(COMMAND).communicate(input=None)
sed: -e expression #1, char 11: unterminated address regex

使用原始字符串形式,它按预期工作:

>>> COMMAND = r"""sed -i -e "$amystring" /home/map/myfile"""
>>> subprocess.Popen(COMMAND, shell=True).communicate(input=None)

我真的很想将 "$amystring" 作为列表的一个元素传递。请避免像

这样的答案
>>> COMMAND = r" ".join(['sed', '-i', '-e', "$amystring", '/home/map/myfile'] 
>>> subprocess.Popen(COMMAND, shell=True).communicate(input=None)

这两种形式的不同之处在于,使用 shell=True 作为参数,字符串按原样传递给 shell,然后由 shell 对其进行解释。这导致(bash):

sed -i -e $amystring /home/map/myfile

运行.

使用列表参数和默认值 shell=False,python 直接使用列表中的参数调用可执行文件。在这种情况下,文字字符串被传递给 sed,

sed -i -e '$amystring' /home/map/myfile

'$amystring' 不是有效的 sed 表达式。在这种情况下,您需要调用

>>> COMMAND = ['sed', '-i', '-e', "$amystring", '/home/map/myfile']
>>> subprocess.Popen(COMMAND).communicate(input=None)

因为 shell.

不需要转义字符串

没有原始字符串这样的东西。只有原始字符串 literals.

文字 -- 它是您在 Python 源代码中键入的内容。

r'$amystring''\$amystring' 是相同的 字符串对象 ,尽管使用不同的字符串 字符串文字 表示。

As :如果没有shell=True那么你不需要转义$ shell元字符。仅当 运行 shell:

中的命令时才需要它
$ python -c 'import sys; print(sys.argv)' "$amystring"
['-c', '$amystring']

注意:输出中没有反斜杠。

除非您使用 PIPE 重定向标准流,否则不要使用 .communicate(),您可以使用 call()check_call() 代替:

import subprocess

rc = subprocess.call(['sed', '-i', '-e', '$amystring', '/home/map/myfile'])

要在 Python 中模拟 $amystring sed 命令(± 换行符):

with open('/home/map/myfile', 'a') as file:
    print('mystring', file=file)