如何在不使用原始字符串的情况下将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)
答案 0 :(得分:2)
两种形式之间的区别在于,以shell=True
作为参数,字符串将原样传递给shell,然后shell会对其进行解释。这导致(使用bash):
sed -i -e \$amystring /home/map/myfile
正在运行。
使用list args和默认的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转义字符串。
答案 1 :(得分:0)
没有原始字符串这样的东西。只有原始字符串文字。
文字 - 它是您在Python源代码中输入的内容。
r'\$amystring'
和'\\$amystring'
是相同的字符串对象,尽管使用不同的字符串字符串文字表示。
作为@Jonathan Villemaire-Krajden said:如果没有shell=True
,那么您不需要转义$
shell元字符。如果在shell中运行命令,则只需要它:
$ python -c 'import sys; print(sys.argv)' "\$amystring"
['-c', '$amystring']
注意:输出中没有反斜杠。
除非您使用.communicate()
重定向标准流,否则请勿使用PIPE
,您可以改为使用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)