我正在编写一个Firefox扩展,它通过本机消息传递连接到python3程序。目前我正在通过临时加载about:debugging页面来测试插件。
python部分负责在sqlite数据库中存储数据(例如:从Web收集的信息)。只要数据只包含ASCII范围内的字符,一切正常。一旦数据包含该范围之外的字符(例如:西里尔字母),python程序似乎“冻结”。此时,如果我在sqlite浏览器中打开数据库,则具有unicode字符的行不可用。然后,如果我重新加载我的插件:debugging(有效地终止python程序),行在数据库中正确显示。
我在查询中使用参数替换,它们位于try
块内,这样我就可以记录任何错误,但是日志文件中没有显示任何错误(或者在Firefox浏览器控制台中输出{{1}应该显示本机应用程序。)
另一个奇怪的事情是,我尝试在我向数据库插入数据的函数中记录的任何内容在python程序终止之前也不会显示在日志文件中。
什么可能导致这种“冻结”?我怎么能进一步调试呢?
更新
这是一个可以重现问题的最小代码:
以下是the native python 3 app,这是addon main.js文件。 Python版本是3.4.3,OS是Ubuntu 14.04 64bit,Firefox是59.0b11(64位)开发者版本。
前三个消息没有问题,当发送最后一个消息时会产生上述症状。
答案 0 :(得分:0)
似乎我没有正确解码来自stdin的消息。原来我有:
raw_message = sys.stdin.read(message_length)
现在我有了这个:
raw_message = sys.stdin.buffer.read(message_length).decode(sys.stdin.encoding)
或者,如果stdin的编码不是'utf8'(例如:在Windows上):
raw_message = sys.stdin.buffer.read(message_length).decode('utf8')
这样就不会发生冻结。