导入被另一个同名包覆盖的默认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
中删除的内容。现在更正。我也不能推荐一次性导入。其他人可能已经在您之前加载的模块中导入了错误的版本。在这种情况下,你基本上是在反对整个进口机器,这对我来说,你应该只是修复安装。呻吟。。。这是真的。。。除非在第一次导入之前也弹出模块。