如何在python子流程中正确转义特殊字符?

如何在python子流程中正确转义特殊字符?,python,python-2.7,subprocess,Python,Python 2.7,Subprocess,我正在尝试使用python子进程运行这个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=subproc

我正在尝试使用python子进程运行这个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

使用此命令:
p2.communicate()[0]。拆分(“\n”)


它将输出一个行列表。

如果您使用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

当您不调用shell时,您错误地传递了shell引用(以及shell甚至不需要的额外shell引用!)。不要那样做

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

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

我可以用它,但我真的想知道我在这里如何使用
Awk
,它涉及特殊的字符,比如
,{,},,,/
etcYou惊人地成功地正确删除了
find
命令行中的引号,因此不清楚为什么会出现此错误。当然,如果您有
find-iname'*.py'
您还有
find-printf'%f\n'
,这就不需要在Awk或Python中进行任何后处理。