python
  • python-2.7
  • python-3.x
  • 2015-11-11 81 views 1 likes 
    1

    我正在使用subprocess模塊​​與linux命令的輸出進行交互。下面是我的代碼。在執行第二子即Python中subprocess.PIPE的替換?

    p = subprocess.Popen("grep \"controller\|worker\""+ file_name,stdout=subprocess.PIPE, shell=True) 
    

    import subprocess 
    import sys 
    
    file_name = 'myfile.txt' 
    p = subprocess.Popen("grep \"SYSTEM CONTROLLER\" "+ file_name, stdout=subprocess.PIPE, shell=True) 
    (output, err) = p.communicate() 
    print output.strip() 
    
    p = subprocess.Popen("grep \"controller\|worker\" "+ file_name, stdout=subprocess.PIPE, shell=True) 
    (output, err) = p.communicate() 
    lines = output.rstrip().split("\n") 
    print lines 
    

    我的程序掛起我知道了這一進程掛起的原因是緩衝重定向到subprocess.PIPE是越來越充滿,進一步寫哪些塊的過程。

    我想知道是否有任何方式,以避免緩衝器滿載情況,使我的程序一直沒有任何掛起問題時執行?

    +0

    我認爲(但不知道)的誤差是在使用雙引號到兩個子進程。使用double來分隔命令字符串和單個字符或反之。考慮使用'os.system()' – fattidare

    +0

    @fattidare錯誤未使用雙引號。這是因爲在許多其他文件中使用PIPE。 – pankmish

    +0

    爲什麼你想要在子進程中執行'grep'?爲什麼不使用Python的're'模塊來執行您的正則表達式操作? –

    回答

    3

    的實際問題是,有一個空白圖案和文件名,並因此grep等待輸入上的標準輸入(stdin)之間缺失。

    「緩衝區滿」.communicate()是不容易)或p.stdout.read()(它修復什麼:它加載輸出到內存中,不像.communicate()失敗如果使用一個以上的管道)這裏有一個紅色的鯡魚。

    shell=True和使用的命令列表參數:

    #!/usr/bin/env python 
    from subprocess import Popen, PIPE 
    
    p = Popen(["grep", r"controller\|worker", file_name], stdout=PIPE) 
    output = p.communicate()[0] 
    if p.returncode == 0: 
        print('found') 
    elif p.returncode == 1: 
        print('not found') 
    else: 
        print('error') 
    
    2

    因爲它說,在https://docs.python.org/3/library/subprocess.html#subprocess.Popen.communicate

    注:讀到的數據緩存在內存中,因此,如果數據量很大或無限不要使用此方法 。

    相反,使用file objects來閱讀文本,因爲它產生:

    output = p.stdout.read() 
    

    只要沒有其它管道(例如標準錯誤)填補,而你正在閱讀的過程中不應該受阻。

    相關問題