[英]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.