我试图使用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
答案 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")
。
它将输出一个行列表。