导入由另一个具有相同名称的包覆盖的默认python包

时间:2015-02-12 19:16:53

标签: python

我正在使用一个库,他们认为创建一个名为json的模块是一个好主意,它完全不像标准json模块

有没有办法导入默认的json模块?

2 个答案:

答案 0 :(得分:3)

您可以导入带别名的任何模块。 因此,如果它们都被命名为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

如果你不从json中删除sys.modules,它仍会在将来的导入上发生冲突(这可能会导致问题),但至少你可以处理这两个包中的问题。一个实例(在@Kevin评论之后编辑为更明确)。

一个好的解决方法是 monkeypatch 这个命名不佳的模块。

基本上,创建一个名为notjson的模块,并在__init__内部从third_json中取出所有需要的对象,并将它们放在__init__命名空间中。

如果他们有这样的包结构:somepackage.json,那么除了使用from导入之外,您不需要做任何特殊的事情。

>>> import json as python_json
>>> from somepackage import json as third_json

答案 1 :(得分:3)

在py2中,您可以使用绝对导入

from __future__ import absolute_import
import json #this imports standard lib json
import mypackage.json as my_json #import custom json module