簡體   English   中英

python - 防止IOError:[Errno 5]在沒有stdout的情況下運行時輸入/輸出錯誤

[英]python - prevent IOError: [Errno 5] Input/output error when running without stdout

我有一個腳本通過cronjob在服務器上自動運行,它導入並運行其他幾個腳本。

其中一些使用print,這自然會產生IOError: [Errno 5] Input/output error因為腳本在沒有連接任何SSH /終端的情況下運行,因此沒有正確的stdout設置。

關於這個主題有很多問題,但我找不到任何實際解決它的人,假設我無法刪除打印或更改執行的腳本。

我嘗試了幾件事,包括:

class StdOut(object):
    def __init__(self):
        pass
    def write(self, string):
        pass
sys.stdout = StdOut()
sys.stderr = StdOut()

from __future__ import print_function
import __builtin__

def print(*args, **kwargs):
        pass
    __builtin__.print = print

但它都不起作用。 我認為它只會影響模塊本身,而不會影響我以后導入/運行的模塊。

那么如何創建一個會影響流程中所有模塊的存根標准輸出? 就像我說的,我不想更改從主模塊執行的腳本,但我可以更改導入模塊中的所有內容。 只是為了清除 - 一切都是進口的,沒有新的流程產生等。

謝謝,

修改內置或更改sys.stdout 應該有效(除了子進程 - 但你已經排除了這些),只要你盡早完成。 如果沒有,那么更低級別的技巧會更容易:

  • 使用丟棄輸出的I / O重定向運行python腳本:

     python foo.py >/dev/null 2>&1 

    (假設Unix-y腳本,如問題中“cron”所暗示的那樣)

  • 或者,重定向文件描述符1和2(與上面相同的想法,但在Python啟動時完成,而不是作為cron調用命令的一部分):

     import os fd = os.open(os.devnull, os.O_RDWR) # NB: even if stdin is closed, fd >= 0 os.dup2(fd, 1) os.dup2(fd, 2) if fd > 2: os.close(fd) 

    (如果所有描述符都已關閉,則此特定位代碼具有使/ dev / null充當stdin的副作用)。 [ 編輯 :我從with open(...) ,然后切換到os.open並沒有測試最終版本。 現在修復。]

總而言之,一個好的cron確實應該將stdout和stderr連接到某個地方,並且應該將輸出/錯誤輸出通過電子郵件發送給您。 不是所有的cron版本都很好。

暫無
暫無

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

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