我正在使用libusb1,并且在我的主模块中有平台模块时,发现导入错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/duranda/.local/lib/python3.6/site-packages/usb1/__init__.py", line 61, in <module>
from . import libusb1
File "/home/duranda/.local/lib/python3.6/site-packages/usb1/libusb1.py", line 199, in <module>
libusb = _loadLibrary()
File "/home/duranda/.local/lib/python3.6/site-packages/usb1/libusb1.py", line 161, in _loadLibrary
system = platform.system()
AttributeError: module 'platform' has no attribute 'system'
通过从包含platform.py
或的目录中启动Python解释器platform/__init__.py
,然后使用导入usb1,可以轻松地重现该代码import usb1
。
本地模块如何可能platform
掩盖了第三方模块中的另一个模块(在这种情况下为标准库中的模块)?据我所知,libusb1 直接导入platform
并且不会对全局变量做任何疯狂的事情。
由于模块平台位于您的工作目录中,因此Python解释器会在开始时将当前工作目录插入sys.path中。您可以打印出sys.path进行检查。
因此,Python解释器使用基于sys.path的模块时找到的第一个模块,该模块是您自己的模块,而不是标准库中的模块。
解决方法(技巧)是将当前工作目录移动到结束位置。注意将其放在文件的顶部,然后导入模块
import sys
# move the current working directory to the end position
sys.path = sys.path[1:] + sys.path[:1]
更多评论:
回复@gelonida:假设我们确实要使用这两个模块,我们可以先导入一个模块并给它一个别名,然后修改sys.path以导入另一个模块
import sys
# <------- newly added
_platform = patch_module('platform', '_platform') # our own module
# move the current working directory to the end position
sys.path = sys.path[1:] + sys.path[:1]
上面的代码使用了patch_module()方法
def patch_module(source_module_name, target_module_name):
""" All imported modules are cached in *sys.modules*
"""
__import__(source_module_name)
m = sys.modules.pop(source_module_name)
sys.modules[target_module_name] = m
target_module = __import__(target_module_name)
return target_module
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句