我使用subprocess
在python中调用程序,并且我将一个字符串传递给它,它可以包含引号。
这是给我带来麻烦的代码
import subprocess
text = subprocess.Popen("""awk 'BEGIN { print "%s"}' | my_program """ % sentence, stdout=subprocess.PIPE, shell=True)
sentence = "I'm doing this"
时收到以下错误消息
/bin/sh: -c: line 0: unexpected EOF while looking for matching `"'
/bin/sh: -c: line 1: syntax error: unexpected end of file
我想这与在python和linux中转义引号的方式有关。有办法解决吗?
答案 0 :(得分:1)
你混淆了awk
和底层shell,因为引用的awk表达式中有引号。第一部分相当于:
awk 'BEGIN { print "I'm doing this"}'
哪个不正确,即使在纯shell中也是如此。
Quickfix,转义句子中的引号:
text = subprocess.Popen("""awk 'BEGIN { print "%s"}' | my_program """ % sentence.replace("'","\\'"), stdout=subprocess.PIPE, shell=True)
正确修复:根本不要使用awk
来打印内容,只需将输入提供给子流程:
text = subprocess.Popen(my_program, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
output,error = text.communicate(sentence.encode())
(你可以摆脱过程中的shell=True
)
最后一点:您似乎遇到了麻烦,因为my_program
是一些程序加参数。要传递aspell -a
之类的命令,您可以执行以下操作:
my_program = "aspell -a"
或:
my_program = ['aspell','-a']
但不是
my_program = ['aspell -a']
这可能就是你在这里所做的,所以Python试图逐字执行程序"aspell -a"
,而不是分成程序+参数。