导入被另一个同名包覆盖的默认python包
我正在使用一个库,他们认为创建一个名为导入被另一个同名包覆盖的默认python包,python,Python,我正在使用一个库,他们认为创建一个名为json的模块是个好主意,它与标准的json模块完全不同 是否有方法导入默认的json模块?您可以导入任何具有别名的模块。 因此,如果它们都命名为json,则需要更改导入路径 >>> import sys >>> hold, sys.path = sys.path, [] >>> # pop whatever json is already imported >>> sys.module
json
的模块是个好主意,它与标准的json
模块完全不同
是否有方法导入默认的
json
模块?您可以导入任何具有别名的模块。
因此,如果它们都命名为json
,则需要更改导入路径
>>> import sys
>>> hold, sys.path = sys.path, []
>>> # pop whatever json is already imported
>>> sys.modules.pop('json', None)
>>> # import json from system python
>>> import json as python_json
>>> # clean json from sys.module again
>>> del sys.modules['json']
>>> sys.path = hold
>>> # import the 3rd party json
>>> import json as thrid_json
如果您不从sys.modules
中删除json
,它在将来的导入中仍然会发生冲突(这可能会导致问题),但至少您在一个实例中对两个包都有一个句柄(在@Kevin的注释后编辑为更明确)
一个好的解决方法是monkeypatch命名不好的模块
基本上,创建一个名为notjson
的模块,并在\uuuuu init\uuuuu
中从third\ujson
中取出所有所需的对象,并将它们放在\uuuu init\uuuuu
命名空间中
如果他们有这样的包结构:somepackage.json
,那么除了使用从
导入之外,您不需要做任何特殊的事情
>>> import json as python_json
>>> from somepackage import json as third_json
在py2中,可以使用绝对导入
from __future__ import absolute_import
import json #this imports standard lib json
import mypackage.json as my_json #import custom json module
您当前如何导入模块?执行
import json
应该导入标准的json模块,除非您是从其他库中的代码执行的(或者您使用其他库中设置的当前目录执行代码)。我正在尝试扩展他们的库,因此我必须从他们的库中导入json。这正是我所需要的。非常感谢你。啊。。。我忘了。很好的解决方案。但是,如果第三方json
安装到站点软件包中,它会起作用吗?如果您安装了第三方json模块,它可能不会被导入,因为python通常在进入站点软件包之前在stdlib中搜索。我的观点正是如此。。在这种情况下,除非您更加努力,否则只能导入其中一个。我认为它首先搜索站点包
,然后搜索stdlib
——它搜索当前目录,sys.path
,然后搜索python包目录。就我个人而言,应该避免任何与stdlib模块同名的第三方模块。但是,是的,如果你想像gevent那样重载stdlib,那么monkey补丁就是一个不错的选择。这种技术是行不通的。正确诊断后,它们将在sys.modules
中发生冲突。由于此冲突,以后的导入将返回与以前导入相同的对象(从sys.modules
中检索)。要使用此技巧,您需要手动从sys.modules
中删除它。它确实适用于一次性导入,如果您按照我的建议将其放入monkeypatched模块中。。。应该没问题。但是,您是对的,我在上面明确地省略了从sys.modules
中删除的内容。现在更正。我也不能推荐一次性导入。其他人可能已经在您之前加载的模块中导入了错误的版本。在这种情况下,你基本上是在反对整个进口机器,这对我来说,你应该只是修复安装。呻吟。。。这是真的。。。除非在第一次导入之前也弹出模块。