使用绝对路径导入json的python
我在使用wadofstuff的序列化工具,链接是https://pypi.python.org/pypi/wadofstuff-django-serializers,这个工具是用在django 1.5上的。不过,它用的simplejson现在已经不推荐使用了,所以我需要直接去修改库文件wadofstuff/django/serializers/json.py
,把simplejson改成json。问题是,我不能import json
,因为这个库文件也叫json.py
,这样就会尝试加载它自己。我不想改文件名,因为我团队里的其他开发者肯定会对我不满。有没有办法从绝对路径导入json呢?
谢谢。
4 个回答
你可以在 json.py
文件的最上面加上这一行:
from __future__ import absolute_import
这样做是为了告诉 Python,在导入这个模块的时候,它只会在 sys.path 里找模块,而不会相对这个模块的位置去找(想了解更多可以看这个链接:http://www.python.org/dev/peps/pep-0328/#rationale-for-absolute-imports)。
补充说明:
另外要注意,wadofstuff
的模块并不是直接导入 simplejson,而是通过 from django.utils import simplejson
这种方式。Django 的代码 默认会使用标准库里的版本,前提是你没有安装 simplejson。
另一种方法是把当前目录从搜索路径中去掉。假设""
(表示当前目录)在sys.path
的最前面(这是默认情况):
sys.path.remove("")
import json
sys.path.insert(0, "")
解决这个问题最简单、可能也是最好的办法(在Python 2.x中)就是不要有一个模块的名字跟顶层的标准库或site-packages模块重名。
换句话说,把 json.py
改个名字。然后你可以在改名后的文件里直接 import json
(或者更好的是,先试试这个,如果出现 ImportError
错误,再退回去用 simplejson
,这样就不会影响到2.5的兼容性)。接着,只需要把之前导入 serializers.json
的代码改成导入新的模块就可以了。
你应该可以对wadostuff这个包提交一个bug报告,并且提交你的修复建议,可能会在1.2版本中被采纳。(看起来每年大概会更新一次,2013年跟上Python 2.6和Django 1.5的步伐也不是太不合理……)