2016-11-05 58 views
0

我試圖做一個Mac版本的程序,在Windows下運行良好,使用Python 2.7。在Mac(在VirtualBox中運行的OS X El Capitan)下,它失敗了,因爲我傳遞給shell的參數無法正確識別。Python 2 subprocess參數錯誤在Mac

原始代碼:

for item in source_files: 

    # core process 
    output = sub.Popen(["mhl", "verify", "-vv", "-f", item, ">", text_report], 
         shell=True, 
         stdout=sub.PIPE, 
         stderr=sub.PIPE) 
    stdout_value, stderr_value = output.communicate() 

在Mac只有 'MHL' 的說法是公認的,所以我嘗試這樣做:

sub.Popen(['mhl verify -vv -f', item, '>', text_report] 

現在命令工作,但該項目(一.mhl文件)不承認,所以我嘗試這樣做:

sub.Popen(['mhl verify -vv -f', '/Users/simon/Documents/Documents.mhl', '>', text_report] 

這:

sub.Popen(['mhl verify -vv -f', r'/Users/simon/Documents/Documents.mhl', '>', text_report] 

同樣的結果,它告訴我一個mhl文件應該遵循'-f'參數。如果我直接將項目添加到第一個參數,它工作正常:

sub.Popen(['mhl verify -vv -f /Users/simon/Documents/Documents.mhl', '>', text_report] 

我在這裏錯過了什麼?

回答

1

您要求操作系統運行可執行文件'mhl verify -vv -f',並且沒有這樣的可執行文件。沒有外殼拆分發生在那裏的空間。

隨着shell=True你想要的一切傳爲一個字符串,而不是作爲單獨的參數:

sub.Popen('mhl verify -vv -f {} > {}'.format(item, text_report), 
      shell=True, stdout=sub.PIPE, stderr=sub.PIPE) 

注意,有在指導stdout到管道在這裏,小點,因爲所有的標準輸出輸出從mhl命令被重定向到一個文件。

如果您想直接在Python中捕獲mhl命令的輸出,我不會在這裏使用shell中介;運行無shell=True,然後只用subprocess.check_output()檢索輸出:

output = sub.check_output(['mhl', 'verify', '-vv', '-f', item]) 

注意,現在的程序名和參數必須在準備分裂傳遞到單獨的字符串。

+0

感謝您的回答,但它不起作用,與原始代碼一樣,只有'mhl'參數被識別,它告訴我'參數的數量無效'。實際上'mhl verify -vv -f'被正確識別爲使用'verify -vv -f'參數調用mhl可執行文件,但它告訴我一個mhl文件應該遵循'-f'參數。 –

+0

@SimonTheChain:你也傳入'item','>'和'text_report'。 –

+0

@SimonTheChain:更新;我錯過了你有'shell = True'設置。你仍然有一個命令'mhl verify -vv -f item'在這裏執行。 –