我已经搜索了很长一段时间来寻找这个问题的答案,我认为这在很大程度上与我不熟悉 subprocess 模块的工作原理有关。如果有人感兴趣,这是一个模糊测试程序。另外,我应该提到这一切都是在 Linux 中完成的(我认为这是相关的)我有一些这样的代码:
# 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()
100 次中有 99 次都可以正常工作,但有时我会收到类似于以下内容的错误:
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
这是子进程、我使用它运行的应用程序还是我的代码的问题?任何指针都会受到赞赏(尤其是当它与子进程 stdout 和 stderr 的正确使用有关时)。