2017-03-14 46 views
1

我有一個運行幾個子進程的python腳本。將子進程pid寫入日誌文件時出現錯誤

我想實現的是,我想將子進程進程ID寫入單獨的日誌文件。子進程可以運行幾個小時,所以我想用PID來跟蹤它們。

不知何故,我無法將PID寫入日誌文件,因爲我遇到了異常。

tmprocess = subprocess.Popen(['sudo', logstashbin, '-f', tmconf], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
tmprocess.wait() 
segmentprocess = subprocess.Popen(['sudo', logstashbin, '-f', segmentconf], stdout=subprocess.PIPE, stderr=subprocess.STDOUT).pid 
print segmentprocess 

try: 
    pidfile = open("pid.log", "a+") 
    try: 
     pidfile.write(segmentprocess) 
    finally: 
     pidfile.close() 
except: 
    raise IOError("Error") 

這是輸出我得到的,

1237 
Traceback (most recent call last): 
    File "./init.py", line 285, in <module> 
    main(sys.argv[1:]) 
    File "./init.py", line 282, in main 
    init(arg) 
    File "./init.py", line 264, in init 
    run_logstash(langPath) 
    File "./init.py", line 228, in run_logstash 
    raise IOError("Error") 
IOError: Error 

雖然正在打印的PID是,它沒有得到寫入文件。 注意:如果我只是通過替換「segmentprocess」將一些隨機字符串寫入日誌文件,那麼它確實有效。所以文件打開沒有任何問題。

+1

你的壓痕看起來不正確。你能檢查它嗎?此外,您提供的堆棧跟蹤似乎會引發與您的代碼中不同的異常。有什麼我們沒有看到?你能否包括你提供的行號範圍?另外,如果你試圖調試異常,爲什麼會重新引發另一個異常?只要讓真正的例外冒出來並將其張貼在這裏。不要抓住它,如果你這樣做,確保你再次提升。而不是'提高IOError(「Error」)'。 –

+0

@JamieCounsell,非常感謝大家。我在我的帖子中修正了上面的壞縮進(我的原始代碼沒有縮進問題)。我實際上修復了錯誤,我發現錯誤並不明智。當我刪除try,except塊時,我看到實際的錯誤「TypeError:expected a character buffer object」。我只需要進行類型轉換,並且錯誤消失了。這樣的noob錯誤。我想我最好刪除這篇文章?再次感謝你的幫助。 – Vinod

+1

很高興你知道了!我發表了我的評論作爲答案。刪除帖子或標記爲已解決。 –

回答

1

您提供的堆棧跟蹤似乎會引發與您的代碼中不同的異常。有什麼我們沒有看到?你能否包括你提供的行號範圍?另外,如果你試圖調試異常,爲什麼會重新引發另一個異常?只要讓真正的例外冒出來並將其張貼在這裏。不要抓住它,如果你這樣做,請確保你只是raise。取而代之的

raise IOError("Error") 

你應該

raise 

還是不要嘗試/除了在所有:

pidfile = open("pid.log", "a+") 
try: 
    pidfile.write(segmentprocess) 
finally: 
    pidfile.close()