簡體   English   中英

如何正確地轉義python子進程中的特殊字符?

[英]How to correctly escape special characters in python 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=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

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

當您不調用外殼程序時,會錯誤地傳入外殼程序引用(以及外殼程序甚至不需要的額外外殼程序引用!)。 不要那樣做

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

shell=True您需要在一些參數周圍加上額外的引號以保護它們不受shell的影響,但是這里沒有shell,因此放入它們是不正確的,並且會導致Awk解析錯誤。

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

它將輸出行列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM