簡體   English   中英

IOError 打印時輸入/輸出錯誤

[英]IOError Input/Output Error When Printing

我繼承了一些由於在調用打印期間引發輸入/輸出錯誤而定期(隨機)失敗的代碼。 我正在嘗試確定引發異常的原因(或至少更好地理解它)以及如何正確處理它。

執行以下 Python 行時(在 2.6.6 解釋器中,在 CentOS 5.5 上運行):

print >> sys.stderr, 'Unable to do something: %s' % command

引發異常(省略回溯):

IOError: [Errno 5] Input/output error

對於上下文,這通常是當時較大的函數試圖做的事情:

from subprocess import Popen, PIPE
import sys
def run_commands(commands):
    for command in commands:
        try:
            out, err = Popen(command, shell=True, stdout=PIPE, stderr=PIPE).communicate()
            print >> sys.stdout, out
            if err:
                raise Exception('ERROR -- an error occurred when executing this command: %s --- err: %s' % (command, err))
        except:
            print >> sys.stderr, 'Unable to do something: %s' % command
run_commands(["ls", "echo foo"])

>>語法對我來說不是特別熟悉,它不是我經常使用的東西,而且我知道它可能是寫入 stderr 的最不受歡迎的方式 但是,我不相信替代方案會解決根本問題。

從我讀過的文檔來看,IOError 5 經常被誤用,並且定義有點松散,不同的操作系統使用它來解決不同的問題。 在我的情況下,我能看到的最好的情況是 python 進程不再連接到終端/pty。

盡我所能,我可以說沒有任何東西將進程與 stdout/stderr 流斷開連接——例如,終端仍然打開,一切“似乎”都很好。 是否是由子進程以不干凈的方式終止引起的? 還有什么可能是這個問題的原因 - 或者我可以引入哪些其他步驟來進一步調試它?

在處理異常方面,我顯然可以捕獲它,但我假設這意味着我將無法在執行的其余部分打印到 stdout/stderr? 我可以以某種方式重新附加到這些流 - 也許通過將sys.stdout重置為sys.__stdout__等? 在這種情況下,無法寫入 stdout/stderr 不被認為是致命的,但如果它表明某些事情開始出錯,我寧願早點保釋。

我想最終我不知道從哪里開始調試這個......

我認為這與進程所連接的終端有關。 當我在后台運行 python 進程並關閉我啟動它的終端時出現此錯誤:

$ myprogram.py
Ctrl-Z
$ bg
$ exit

問題是我在遠程服務器中啟動了一個非守護進程並注銷(關閉終端會話)。 一個解決方案是在遠程服務器上啟動 screen/tmux 會話並在此會話中啟動該進程。 然后分離會話+注銷保持與進程關聯的終端。 這至少在 *nix 世界中有效。

我有一個非常相似的問題。 我有一個使用 subprocess 模塊啟動其他幾個程序的程序。 然后這些子進程會將輸出打印到終端。 我發現當我關閉主程序時,它並沒有自動終止子進程(正如我所假設的),而是它們繼續運行。 因此,如果我同時終止主程序和從 * 啟動它的終端,子進程將不再有一個終端連接到它們的標准輸出,並且會拋出一個 IOError。 希望這對你有幫助。

*注意:必須按此順序完成。 如果你只是殺死終端,(出於某種原因)這會殺死主程序和子進程。

我剛剛收到此錯誤,因為我正在寫入文件的目錄內存不足。 不確定這是否完全適用於您的情況。

我是新來的,所以如果我在代碼細節方面有點失誤,請原諒。 最近,當與運行 python 腳本相關的終端關閉時,我能夠弄清楚是什么原因導致了打印語句的 I/O 錯誤。 這是因為要打印到 stdout/stderr 的字符串太長。 在這種情況下,“out”字符串是罪魁禍首。 要解決這個問題(在運行 python 腳本時不必保持終端打開),只需逐行讀取“out”字符串,並逐行打印,直到我們到達“out”字符串的末尾。 就像是:

while true:
        ln=out.readline()
        if not ln: break
        print ln.strip("\n") # print without new line

如果將整個字符串列表打印到屏幕上,也會出現同樣的問題。 只需一項一項地打印列表。 希望有幫助!

當您的外殼在打印嘗試將數據寫入其中時崩潰時,可能會發生這種情況。

就我而言,我只是重新啟動服務,然后這個問題就消失了。 現在不知道為什么。 我的問題是與 Odoo 相同的 OSError 輸入/輸出錯誤。

我重新啟動服務后,它消失了。

問題是您已經關閉了在調用print()時 python 試圖寫入的stdout管道

這可能是由於使用&在后台運行腳本然后關閉終端會話(即關閉stdout )造成的

$ python myscript.py &
$ exit

一種解決方案是在后台運行時將stdout設置為文件

例子

$ python myscript.py > /var/log/myscript.log 2>&1 &
$ exit

print()沒有錯誤

暫無
暫無

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

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