簡體   English   中英

捕獲Python腳本輸出

[英]capture Python script output

我編寫了非常小的腳本,並嘗試捕獲腳本的輸出。 我以類似的方式寫過多次,但從未遇到過問題。 我可以輸入嗎? 我想我犯了很愚蠢的錯誤

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

您實際上從未關閉過fp_numpy ,因此在您嘗試運行該腳本時,該腳本可能為空或不完整。

它不能保證為空,但很有可能 當我在裝有7種不同版本的Python的兩台不同的* nix計算機上嘗試此操作時,它每次都是空的(事實是,在腳本完成后,文件被關閉並因此被刷新,這使得問題更難以調試。)

解決此問題的最佳方法是使用with語句,因此不可能忘記關閉文件:

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

但是除此之外,您還有另一個問題。 如果生成的腳本引發異常,它將不輸出任何內容到stdout,並將回溯轉儲到stderr,您將讀取並忽略它。 當您忽略錯誤時,調試問題非常困難……我不知道您為xy傳遞了什么,但是,例如,如果要傳遞numpy.array而不是計算結果為一個的字符串,您很容易就能獲得異常,而永遠不會看到它。 將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)

使用print out而不是print "out"

看看這個方法

see.py

for line in range(6):
    print line

me @ pubx:〜$ python see.py>全部

我不知道您為什么要編寫腳本來捕獲腳本的輸出(也許您有充分的理由)。 使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM