使用绝对路径导入json的python

0 投票
4 回答
1419 浏览
提问于 2025-04-17 19:18

我在使用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 个回答

0

你可以在 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。

0

另一种方法是把当前目录从搜索路径中去掉。假设""(表示当前目录)在sys.path的最前面(这是默认情况):

sys.path.remove("")
import json
sys.path.insert(0, "")
2

解决这个问题最简单、可能也是最好的办法(在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的步伐也不是太不合理……)

撰写回答