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

2024-09-30 22:10:17 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

^{pr2}$

我非常感兴趣的是将"\$amystring"作为列表的一个元素传递。请避免回答

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

Tags: 字符串命令maphome列表addressmyfilesed
2条回答

这两种形式的区别在于,以shell=True作为参数,字符串按原样传递给shell,然后由shell解释它。这将导致(使用bash):

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

正在运行。在

使用list参数和默认的shell=False,python直接用列表中的参数调用可执行文件。在本例中,文本字符串被传递给sed

^{pr2}$

并且'\$amystring'不是有效的sed表达式。在这种情况下,你需要打电话

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

因为不需要为shell转义字符串。在

没有原始字符串这样的东西。只有原始字符串文本。在

它是你在Python源代码中键入的东西。在

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

As @Jonathan Villemaire-Krajden said:如果没有shell=True,则不需要转义$shell元字符。只有在shell中运行命令时才需要它:

$ python -c 'import sys; print(sys.argv)' "\$amystring"
['-c', '$amystring']

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

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

^{pr2}$

要在Python中模拟$amystringsed命令(±newlines):

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

相关问题 更多 >