如何在不使用原始字符串的情况下将 `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)
如何在不使用原始字符串的情况下将 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)