强制Python导入是绝对的(忽略本地包目录)

时间:2013-10-14 12:41:46

标签: python python-2.7 python-import

有没有办法强制导入是绝对的而不是相对的?

我正在“覆盖”Python标准库json模块,所以在我的项目中我总是使用正确的编码器和参数:

project/foo/json.py :(标记此文件名)

import json as pyjson

class ComplexEncoder(pyjson.JSONEncoder):
    def default(self, obj):
        if hasattr(obj, 'isoformat'):
            return obj.isoformat()
        else:
            if type(obj) == file:
                return "filestream"
            raise TypeError, 'Object of type %s with value of %s is not JSON serializable' % (type(obj), repr(obj))

def dumps(data):
    return pyjson.dumps(data, cls=ComplexEncoder, check_circular=False, separators=(',', ':'), ensure_ascii=False)

def loads(data):
    return pyjson.loads(data)

当我导入此文件时,我得到了可怕的AttributeError: 'module' object has no attribute 'JSONEncoder'print(pyjson.__file__)确认我怀疑import json as pyjson从本地包而不是Python标准库导入json

有没有办法强制导入是绝对的,所以忽略本地目录?

1 个答案:

答案 0 :(得分:4)

如果你的“json”模块在一个包中,那么这将解决它:

from __future__ import absolute_import

使用__future__语句,导入绝对是默认的 - 即它只会查找名为json的顶级模块或文件。

如果您需要导入本地帐户,则可以import foo.json,或者您可以使用from . import jsonfrom .json import dumps明确要求进行相对导入。

(我假设您使用的是Python 2)。