如何正确转义python子进程中的特殊字符?

时间:2017-11-26 16:52:41

标签: python python-2.7 subprocess

我试图使用python subprocess

运行这个bash命令
find /Users/johndoe/sandbox -iname "*.py" | awk -F'/' '{ print $NF}'

输出: -

helld.xl.py
parse_maillog.py
replace_pattern.py
split_text_match.py
ssh_bad_login.py

这是我用python2.7方式做的,但它给出了awk命令过滤器无法正常工作的输出

>>> p1=subprocess.Popen(["find","/Users/johndoe/sandbox","-iname","*.py"],stdout=subprocess.PIPE)

>>> p2=subprocess.Popen(['awk','-F"/"','" {print $NF} "'],stdin=p1.stdout,stdout=subprocess.PIPE)

>>>p2.communicate()
('/Users/johndoe/sandbox/argparse.py\n/Users/johndoe/sandbox/custom_logic_substitute.py\n/Users/johndoe/sandbox/finditer_html_parse.py\n/Users/johndoe/sandbox/finditer_simple.py\n/Users/johndoe/sandbox/group_regex.py\n/Users/johndoe/sandbox/helo.py\n/Users/johndoe/sandbox/newdir/helld.xl.py\n/Users/johndoe/sandbox/parse_maillog.py\n/Users/johndoe/sandbox/replace_pattern.py\n/Users/johndoe/sandbox/split_text_match.py\n/Users/johndoe/sandbox/ssh_bad_login.py\n', None)

我也可以通过单独使用p1获得输出,如下所示,但我不能让awk在这里工作

list1=[]
result=p1.communicate()[0].split("\n")
for item in res:
    a=item.rstrip('/').split('/')
    list1.append(a[-1])
print list1

3 个答案:

答案 0 :(得分:1)

如果您没有使用 shell = True 进行任何预订,那么这应该是非常简单的解决方案

from subprocess import Popen
import subprocess
command='''
find /Users/johndoe/sandbox -iname "*.py" | awk -F'/' '{ print $NF}'
'''
process=Popen(command,shell=True,stdout=subprocess.PIPE)
result=process.communicate()
print result

答案 1 :(得分:1)

当你没有调用shell时,你错误地传入了shell引用(以及额外的 shell引用,这甚至不需要shell!)。别这么做。

p2=subprocess.Popen(['awk', '-F/', '{print $NF}'], stdin=...

当你有shell=True时,你需要在一些参数周围加上额外的引号来保护它们不受shell的影响,但是这里没有shell,所以把它们放入是不正确的,并且会导致awk的解析错误。

答案 2 :(得分:0)

使用此:p2.communicate()[0].split("\n")

它将输出一个行列表。