2016-05-14 102 views
0

我正在編譯的東西,我想編譯彙編程序,並獲得有關它的輸出信息使用subprocess子進程getoutput不工作

當我使用subprocess.call每一件事工作正常,如:

(我添加一些垃圾郵件,以便它會輸出一個錯誤)

Version : Python3.5 

In [12]: subprocess.call(['as','-32','test.s']) 
test.s: Assembler messages: 
test.s:3: Error: no such instruction: `zxvasdf' 
Out[12]: 1 

但是當我使用subprocess.getoutput

In [13]: subprocess.getoutput(['as','-32','test.s']) 

它只是凍結,什麼都不做。

我該如何解決這個問題?

感謝您的任何建議。

回答

2

問題作爲@Lex Scarisbrick correctly noticedgetoutput(cmd)需要一個shell命令爲字符串。如果你通過一個列表,額外的參數傳遞給POSIX上的shell,而不是'as'進程本身。這意味着'as'程序在沒有任何命令行參數的情況下運行。

它只是凍結,什麼都不做。

看來as沒有命令行參數調用等待它在stdin上的輸入。您可以開始鍵入一些彙編程序並按Ctrl+D來指示EOF。如果你不提供輸入;它會永遠掛起。

Why subprocess.Popen doesn't work when args is sequence?

如果你想讀的標準輸出,標準錯誤從'as'子;你可以使用subprocess.run()

#!/usr/bin/env python3 
import subprocess 

p = subprocess.run(['as','-32','test.s'], 
        stdout=subprocess.PIPE, 
        stderr=subprocess.PIPE, # capture separately 
        universal_newline=True) # decode bytes 
print("Status: {p.returncode}, stdout: {p.stdout}, stderr: {p.stderr}".format(p=p)) 

注:請不要使用shell=True這裏。

0

好吧,看來我可以用subprocess.PIPE來解決問題。

In [16]: proc = subprocess.Popen(['as','-32','test.s'],stdout=subprocess.PIPE,stderr=subprocess.PIPE) 

In [17]: for i in proc.stderr: 
    ....:  print(i) 
    ....:  
b'test.s: Assembler messages:\n' 
b"test.s:3: Error: no such instruction: `zxvasdf'\n" 

但我不明白我爲什麼順利。

我將檢查文檔以獲取更多詳細信息。

謝謝大家。

+0

不通過PIPE,除非在進程仍在運行時從管道讀取,否則可能發生死鎖。 – jfs

0

subprocess.getouput()沒有列出如subprocess.call()那樣的輸入。它將一個參數作爲一個字符串。將其更改爲:

subprocess.getoutput('as -32 test.s') 
+0

你應該嘗試'subprocess.getoutput(['ls',' - a'])' – KIDJourney

+0

它只需要第一個參數。 'getoutput('ls -a')'返回的輸出不同於getoutput(['ls',' - a'])''。因爲只有第一個參數被採用,所以在上面的問題中,'as'命令掛起等待輸入。 –

+0

所有調用都需要args,並且應該是一個字符串或一系列程序參數。提供一系列參數通常是首選,因爲它允許模塊處理任何所需的參數轉義和引用(例如,允許文件名中的空格)。如果傳遞一個字符串,則shell必須爲True(見下文),否則字符串必須簡單地命名要執行的程序而不指定任何參數。 – KIDJourney