python - 使用模块查找器时出现 Python UnicodeDecodeError
问题描述
我想在 python 程序中找到所有导入的模块。我正在使用modulefinder
标准模块来完成我的工作。我正在尝试在文档上遵循此示例,但即使我使用与文档相同的代码,我也会收到此错误:
Traceback (most recent call last):
File "C:\Users\Dinçel\Desktop\Deploy\zipperutils\find modules.py", line 4, in <module>
finder.run_script('bacon.py')
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\modulefinder.py", line 165, in run_script
self.load_module('__main__', fp, pathname, stuff)
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\modulefinder.py", line 360, in load_module
self.scan_code(co, m)
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\modulefinder.py", line 433, in scan_code
self._safe_import_hook(name, m, fromlist, level=0)
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\modulefinder.py", line 378, in _safe_import_hook
self.import_hook(name, caller, level=level)
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\modulefinder.py", line 177, in import_hook
q, tail = self.find_head_package(parent, name)
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\modulefinder.py", line 233, in find_head_package
q = self.import_module(head, qname, parent)
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\modulefinder.py", line 326, in import_module
m = self.load_module(fqname, fp, pathname, stuff)
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\modulefinder.py", line 360, in load_module
self.scan_code(co, m)
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\modulefinder.py", line 433, in scan_code
self._safe_import_hook(name, m, fromlist, level=0)
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\modulefinder.py", line 378, in _safe_import_hook
self.import_hook(name, caller, level=level)
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\modulefinder.py", line 177, in import_hook
q, tail = self.find_head_package(parent, name)
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\modulefinder.py", line 233, in find_head_package
q = self.import_module(head, qname, parent)
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\modulefinder.py", line 326, in import_module
m = self.load_module(fqname, fp, pathname, stuff)
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\modulefinder.py", line 360, in load_module
self.scan_code(co, m)
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\modulefinder.py", line 433, in scan_code
self._safe_import_hook(name, m, fromlist, level=0)
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\modulefinder.py", line 378, in _safe_import_hook
self.import_hook(name, caller, level=level)
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\modulefinder.py", line 177, in import_hook
q, tail = self.find_head_package(parent, name)
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\modulefinder.py", line 233, in find_head_package
q = self.import_module(head, qname, parent)
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\modulefinder.py", line 326, in import_module
m = self.load_module(fqname, fp, pathname, stuff)
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\modulefinder.py", line 360, in load_module
self.scan_code(co, m)
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\modulefinder.py", line 466, in scan_code
self.scan_code(c, m)
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\modulefinder.py", line 433, in scan_code
self._safe_import_hook(name, m, fromlist, level=0)
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\modulefinder.py", line 378, in _safe_import_hook
self.import_hook(name, caller, level=level)
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\modulefinder.py", line 177, in import_hook
q, tail = self.find_head_package(parent, name)
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\modulefinder.py", line 233, in find_head_package
q = self.import_module(head, qname, parent)
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\modulefinder.py", line 326, in import_module
m = self.load_module(fqname, fp, pathname, stuff)
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\modulefinder.py", line 343, in load_module
co = compile(fp.read()+'\n', pathname, 'exec')
File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python38\lib\encodings\cp1254.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 308: character maps to <undefined>
我的操作系统是 Windows 10。
我正在使用 Python3.8.1
如果有更好的方法来查找导入的模块,请告诉我。
感谢帮助!
解决方案
更新:以下是 python 3.8.1 的解决方法
请修改名为 modulefinder.py 的内置包源代码,并从最顶部添加以下代码:
import _locale
_locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8'])
保存并再次运行。它应该工作。
抱歉,以下解决方法适用于 python 3.6.9
我遇到了同样的问题,但我有一个解决方法来解决这个问题:
从任何 SOURCE 脚本中删除任何包含非 ASCII 字符的代码和注释。
更新:
我找到了另一个简单的解决方法:将源代码文件的编码修改为 Windows 默认代码页。您可以使用 notepad.exe 打开您的源代码并保存为 ANSI 编码。
推荐阅读
- javascript - 如何删除重复的 xAxis 标签并在图表上显示所有值
- ios - 在执行批处理操作后我们应该使用 context.refreshObject 还是 context.mergeChanges ?
- laravel - 使用 Laravel Dusk 检索测试结果
- c++ - 服务器无缘无故结束监听套接字(NodeJS & net)
- azure - 在 Azure 的存储帐户防火墙中将跨租户子网列入白名单
- amazon-web-services - AWS S3 存储桶默认存储类
- css - CSS 定位问题:希望表格定位到 TOP
- java - Java导入的流程是什么?
- amazon-web-services -
如何从外部脚本获取和使用返回值? - dialogflow-es-fulfillment - 我想将我使用 dialogflow 中的参数从客户那里得到的数据存储到谷歌表。那可能吗?