繁体   English   中英

强制 Python 导入为绝对(忽略本地 package 目录)

[英]Force Python import to be absolute (ignore local package directory)

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

我正在“覆盖”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 json从本地 package 而不是从 Python 标准库导入 json。

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

如果您的“ json”模块位于软件包中,则可以解决该问题:

from __future__ import absolute_import

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

如果您需要导入本地文件,则可以import foo.json ,也可以使用from . import json import foo.json要求相对导入from . import json from . import jsonfrom .json import dumps

(我假设您正在使用Python 2)。

您可以从 sys.path 中删除自身路径:

self_dir = os.path.dirname(os.path.realpath(__file__))
if self_dir in sys.path:
    sys.path.remove(self_dir)

然后正常导入 json。

如果您需要从本地目录导入任何内容,只需 append sys.path 的路径并导入您需要的内容:

sys.path.append(self_dir)
from local_module import *

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM