2013-12-16 220 views
-1

我有一個程序遵守目錄中的Java文件。我想要做的是創建一個數組,將文件名與其控制檯輸出相關聯。我可以創建數組,但我需要以某種方式獲取字符串形式的控制檯輸出。這是我的打印輸出現在:從subprocess.call獲取字符串?

for fn in directoryContents: 
    if fn.rfind(".java") != -1: 
     subprocess.check_call(['javac', fn])  
     java_class,ext = os.path.splitext(fn) 
     className = fn[0: fn.rfind(".java")] 
     cmd = ['java', className] 
     subprocess.call(cmd, shell=False) 
     print ("\n") 
+0

請參閱[subprocess doc](http://docs.python.org/2/library/subprocess.html)。這很清楚。 – flyer

回答

2

你應該使用subprocess.Popen:

p = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE) 
somestr = p.stdout.readline() 
+0

使用'p.communicate()[0]'支持多行控制檯輸出。 – jfs

1

subprocess.call有一個可選的參數,標準輸出(以及標準錯誤),你可以通過一個可寫的文件對象。您可以將傳遞給一個StringIO,然後將其輸出存儲到一個字符串中,或​​者將其寫入一個實際的文件,然後在需要時讀取它。

+0

這是不正確的。您無法將'StringIO'作爲'stdout'參數傳遞給'subprocess.call'。它期望有一個有效的'.fileno()'對象,例如,常規文件,管道(以及Unix上的套接字)。 – jfs

+0

我不知道。記錄在哪裏? – Thayne

+0

從[文檔](http://docs.python.org/2/library/subprocess.html):「有效值是PIPE,現有文件描述符(正整數),現有文件對象和無。 「 ('現有'一詞暗示像StringIO這樣的類似文件的對象不會被接受,但仍然不明確)。你可以[報告文檔問題](http://bugs.python.org/)。 – jfs

2

要想從一個命令的輸出,你可以使用subprocess.check_output()

import subprocess 

console_outputs = {fn: subprocess.check_output(["javac", fn]) 
        for fn in directoryContents if fn.endswith('.java')} 
+0

與此有關的一個警告是,如果子進程返回非零值,check_output將拋出異常,因爲沒有其他方式來檢索返回值。 – Thayne

+0

@Thayne:是的。這是意圖。 – jfs

+0

我並不是說它不是,只是指出可能會拋出異常。 – Thayne

0

您可以使用subprocess.check_output,返回命令的輸出。