我已經搜索了很長時間瞭解這個問題的答案,我想很多方面都與我對子進程模塊的工作方式不熟悉有關。如果有人感興趣,這是一個模糊的程序。另外,我要指出,這是所有被Linux中做(我認爲這是相關的)我有一些像這樣的代碼:sqlite的子進程,編碼和日誌記錄的問題
# open and run a process and log get return code and stderr information
process = subprocess.Popen([app, file_name], stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
return_code = process.wait()
err_msg = process.communicate()[1]
# insert results into an sqlite database log
log_cur.execute('''INSERT INTO log (return_code, error_msg)
VALUES (?,?)''', [unicode(return_code), unicode(error_msg)])
log_db.commit()
99出的100倍,它工作得很好,但有時我得到類似的錯誤到:
UnicodeDecodeError錯誤: 'UTF8' 編解碼器不能在位置43進行解碼字節0xce:無效延續字節
編輯:全跟蹤
Traceback (most recent call last):
File "openscadfuzzer.py", line 72, in <module>
VALUES (?,?)''', [crashed, err_msg.decode('utf-8')])
File "/home/username/workspace/GeneralPythonEnv/openscadfuzzer/lib/python2.7/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xdb in position 881: invalid continuation byte
這是一個子進程的問題,我使用它運行的應用程序或我的代碼?任何指針將不勝感激(特別是當它涉及subprocess stdout和stderr的正確使用)。
沒有解決方案。只是一個觀察 - 'wait()'和'communicate()'都會等待進程結束。您可以放棄'wait()'調用並執行如下操作:'(out,err,)= process.communicate()return_code = process.returncode' – RedBaron 2013-04-22 08:00:57
您可以給出顯示UnicodeDecodeError發生位置的堆棧跟蹤嗎? – monk 2013-04-22 13:01:01
這也可能是值得指出的Python版本使用,因爲自動解碼/編碼語義在2和3之間不同(和子進程庫也可以) – monk 2013-04-22 13:02:23