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

时间:2015-02-11 15:59:12

标签: python sed popen

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

2 个答案:

答案 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)