【问题标题】:Python UnicodeDecodeError while using modulefinder使用模块查找器时出现 Python UnicodeDecodeError
【发布时间】:2020-05-25 02:45:51
【问题描述】:

我想在 python 程序中查找所有导入的模块。我正在使用modulefinder 标准模块来完成我的工作。我正在尝试在文档上关注this example,但即使我使用与文档相同的代码,我也会收到此错误:

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

如果有更好的方法来查找导入的模块,请告诉我。

感谢您的帮助!

【问题讨论】:

  • 不确定如何解决这个问题,但它肯定与包含非 ASCII 字符的路径有关。显然,Python 假定了一些 8 位编码(可能是 Latin-5),但这是不正确的(路径编码不同)。
  • @lenz 嗯,我也想到了这个。我应该在 CPython 上打开一个错误问题吗?
  • 如果您知道路径是如何编码的,那么您可能可以设置一些环境变量来告诉 Python。
  • 是的,它是 utf-8。它是哪个变量?
  • 你确定吗?我认为在 Windows 上,它通常是 UTF-16。但这取决于文件系统。 – 我不确定是否有环境变量;我只是说可能有......只是想给你一些进一步搜索的指示。

标签: python unicode module python-import decode


【解决方案1】:

更新:以下是 python 3.8.1 的解决方法

请修改内置包源代码,命名为modulefinder.py 并从最上面的位置添加以下代码:

import _locale

_locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8'])

保存并再次运行。它应该可以工作。

抱歉,以下解决方法适用于 python 3.6.9

我遇到了同样的问题,但我有一个解决方法:

从任何 SOURCE 脚本中删除任何包含非 ASCII 字符的代码和 cmets。

更新:

我发现了另一个简单的解决方法: 将源代码文件的编码修改为 Windows 默认代码页。 您可以使用 notepad.exe 打开您的源代码并保存为 ANSI 编码。

【讨论】:

  • 感谢您的回答,包括库吗?
  • 根据我的测试,库不是必需的。
  • 嗯,有趣的是大多数库都在工作,除了 functools(在标准库中)。但是如果有一个包含 functools 的库,我会得到同样的错误。
  • 我也无法在 python 中读取这个文件,它有什么?导入功能工具; f = open(functools.__file__); f.read()
  • 您好,我刚刚找到了 3.8.1 版本的解决方法。请尝试一下。
猜你喜欢
  • 2014-09-23
  • 2019-06-17
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 2018-01-21
  • 1970-01-01
  • 2014-12-15
相关资源
最近更新 更多