Python - 子进程cmd作为列表未正确扩展

时间:2017-05-09 22:47:21

标签: python python-3.x

为什么我作为subprocess()命令传递的列表没有正确扩展的任何想法?

file_name = "some_make_file"
cmd = ['gmake', '-pn', '-f', file_name, '|', 'grep', '-A1', '"^# makefile"', '|', 'grep', '-v', '"^#\|^--"', '|', 'sort', '|', 'uniq']
proc = Popen(cmd, stdout=PIPE, stderr=PIPE)
stdout, stderr = prod.communicate()

输出是一个gmake错误,如果我自己加入cmd以在cmd行上测试它,我会得到这个:

#join
" ".join(cmd)

#output
('gmake -pn -f some_make_file | grep -A1 "^ makefile" | grep -v '
'"^#\\|^--" | sort | uniq')

对于我的生活,我似乎无法弄清楚这个命令有什么问题。有任何想法吗?我没有正确地逃避一些事情吗?添加一个特殊的字符而没有意识到它?

1 个答案:

答案 0 :(得分:0)

您没有运行中间shell,因此无法解释|作为管道命令。即使你设置shell = True,因为你传入了一个列表,它将被转义。管道的正确方法在官方python docs Replacing Shell Pipeline - tdelaney

中给出