我有一個python腳本運行在一個小型服務器上,可以通過三種不同的方式調用 - 從另一個python腳本中,通過cron或gammu-smsd(帶有美妙的移動實用程序[gammu]的SMS守護進程)。該腳本維護,並且含有以下雜牌測量系統上使用的空間(想必這是有可能從內部的Python,但這是快速和骯髒的):只有爲什麼設置stderr = subprocess.STDOUT修復了subprocess.check_output調用?
reportdict['Used Space'] = subprocess.check_output(["df/| tail -1 | awk '{ print $5; }'"], shell=True)[0:-1]
奇怪的是這條線將當腳本被從gammu-smsd運行的shell腳本調用時,失敗。即使CalledProcessError對象的輸出屬性包含正確的輸出,該行也會失敗,並顯示CalledProcessError異常並顯示「返回的退出狀態2」。 shell命令序列中唯一會給出這種錯誤狀態的命令將是awk,狀態2表示致命錯誤。
如果此行的python腳本是由cron,另一個python腳本或命令行調用的,則此行可以正常工作。我打破了我的頭,試圖修復腳本的環境,認爲這一定是問題。最後,雖然我把標準錯誤= subprocess.STDOUT,就像這樣:
reportdict['Used Space'] = subprocess.check_output(["df/| tail -1 | awk '{ print $5; }'"], stderr=subprocess.STDOUT, shell=True)[0:-1]
這是一個調試措施,以幫助我弄清楚,如果一些輸出已於標準錯誤來。但在此之後,腳本開始工作,即使從gammu-smsd呼叫!爲什麼會出現這種情況?我在使用子進程時要求將來參考...
檢查gammu-smsd的stderr在哪裏。找到守護進程的pid,然後執行'ls -l/proc/XXXX/fd/[012]'。我懷疑你會發現fd 2對一些不尋常的東西是開放的 - 可能不可寫。 –