第三包模块中的Python本地模块名称屏蔽标准库

杜兰达

我正在使用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并且不会对全局变量做任何疯狂的事情。

杰克1205

由于模块平台位于您的工作目录中,因此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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Liferay 7 在portlet 模块中包含第三方库包(JsonPath)

从包的__init__.py中屏蔽python子模块

在OCaml中,两个第三方库公开相同的模块名称。连结失败

Python中库、模块、包、对象的区别

有没有一种标准的方法可以在软件包中列出Python模块的名称?

标准模块中的本地化

从第三方库中弃用或隐藏模块或功能

扩展第三方库/模块的存根文件

从第三方库导入 javascript 模块

第三方模块库之间的区别?

导入与当前模块同名的python标准库

从 Python 非标准库导入模块

我可以导入与标准库同名的本地模块吗?

如何确定模块名称是否为python标准库的一部分

模块最终在标准库实现中是否允许可读名称?

Python:包中的“私人”模块

如何在 Odoo 中导入在第三方模块中声明的 Python 纯类?

如何将python第三个模块安装到virtualenv中?

如何从Python中的第三方模块禁用INFO日志记录

C ++标准中的第三方库

python模拟第三方模块

prestashop上mailalert中的第三方模块

Python:在个人Python包中包含第三方库

在本地Meteor包中链接本地node.js模块

如何检查模块/库/软件包是否是python标准库的一部分?

在不使用第三方工具的情况下从实体框架中的数据库更新模块

Angular Architecture-导入第三方库以将其使用到功能模块中

从python 2.7中的包中导入名称,子模块或子包的优先级是什么?

与标准库中的模块同名并且也需要导入相同模块的模块