2013-10-17 202 views
1

我寫了非常小的腳本並嘗試捕獲腳本的輸出。我寫了多個時間類似的方式,但從來沒有問題。我可以提供意見嗎?我覺得我做的很愚蠢的錯誤捕獲Python腳本輸出

numpy_temp = """ 
import numpy 
import sys 
a, b, c = numpy.polyfit(%s,%s, 2) 
print a, b, c""" %(x, y) 
fp_numpy = open("numpy_temp.py", "w") 
fp_numpy.write(numpy_temp) 
cmd = "/remote/Python-2.7.2/bin/python numpy_temp.py " 
proc = subprocess.Popen(cmd, stdout = subprocess.PIPE, 
      stderr = subprocess.PIPE, shell = True) 
out, err = proc.communicate() 
print "out", out 
+1

也許你實際上得到了stderr反應。嘗試'打印出來,錯誤',看看你有什麼。 – sberry

回答

2

你從來沒有真正關閉fp_numpy,所以腳本可以在你嘗試運行它的時候空或不完整。

這不是保證是空的,但它非常可能。當我在兩個具有7種不同版本的Python的不同版本的nix計算機上試用這個版本時,它每次都是空的......(事實上,腳本完成後,文件被關閉並因此被刷新,使得調試更難。)

解決這個問題的最好辦法是使用with語句,所以它不可能忘記關閉文件:

with open("numpy_temp.py", "w") as fp_numpy: 
    fp_numpy.write(numpy_temp) 

但除此之外,你已經得到了另一個問題。如果生成的腳本產生一個異常,它將不會向stdout輸出任何內容,並會將traceback轉儲到您將讀取並忽略的stderr。當你忽略錯誤時,調試問題非常困難......我不知道你通過了xy,但是如果你通過了numpy.array而不是一個評估爲1的字符串,那麼你可以很容易地得到一個例外,永遠不會看到它將stderr發送到stdout,或者在末尾發送print "err", err

最後,你真的不應該使用一個命令字符串和shell=True在這裏,因爲你最終得到額外的間接水平沒有很好的理由,它可以使事情變得更難調試。只要這樣做:

cmd = ["/remote/Python-2.7.2/bin/python", "numpy_temp.py"] 
proc = subprocess.Popen(cmd, stdout = subprocess.PIPE, 
         stderr = subprocess.PIPE) 
+0

確實,文件沒有關閉,並且隨後是空的。 – sberry

0

使用print outprint "out"

+0

兩種方式相同的結果。在複製代碼期間錯過了它 – user765443

0

退房這種方法

see.py

 
for line in range(6): 
    print line 

我@ pubx:〜$蟒蛇see.py>所有

0

我不知道爲什麼你要編寫捕獲腳本輸出的腳本(也許你有一個很好的理由)。使用shell這種任務更容易。

創建您的numpy_temp.py,然後將其輸出到一個文件。

/remote/Python-2.7.2/bin/python numpy_temp.py > output.txt 

將數據追加到現有的文件中使用

/remote/Python-2.7.2/bin/python numpy_temp.py >> output.txt