我最近决定升级到python 3,并开始转换我的一些脚本。我在一个脚本中遇到了一个问题,该脚本使用了一个名为io的模块--在Python2中,这是非常好的,但是在Python3中,io是一个标准的文件模块。我发现this old question有类似的问题,但是这似乎是在引用Python2。我有相反的问题-给定顶层包中的两个文件,main.py和io.py,main.py中的import io将导入标准io模块,而不是本地模块。from __future__ import absolute_imports没有提供帮助,from . import io和相关的尝试如预期的那样失败了(我从来不理解这一点-- python真的不知道顶层包在哪里?)。重命名显然是一种解决方案,但如果可能的话,我想避免它。有没有一些python 3标准的方法来解决模块名称冲突?
发布于 2012-11-04 17:12:44
这是我的答案:
我的目录结构:-
calvin$ tree /Users/calvin/work/learn3/
/Users/calvin/work/learn3/
└── myspecialpackage
├── __init__.py
├── __init__.pyc
├── io.py
├── io.pyc
└── main.py__init__.py是一个空文件。
io.py是您的自定义模块,它与python3的io模块冲突。
main.py包含以下示例代码:
import os
import sys
# These two lines are not needed you are installing the `myspecialpackage` via pip/pypi and as setup.py script places "myspecialpackage" and all its contents in your python site-packages, which is already in PYTHONPATH.
our_package_root = os.path.dirname(os.path.realpath(__file__))
sys.path.append(our_package_root)
from myspecialpackage import io
print(io.__file__)导入的io模块将是您的io.py中的模块,而不是python3的模块。
作为额外的好处,使用这种方法将允许我们拥有您的自定义io.py以及Python3的io模块(如果您希望拥有您的蛋糕并将其吃掉;-)。你可以像下面这样解释命名空间io的使用:-
from myspecialpackage import io as my_special_io
print(my_special_io.__file__)
import io
print(io.__file__)然后,运行main.py将为您提供:
In [3]: run myspecialpackage/main.py
/Users/calvin/work/learn3/myspecialpackage
./myspecialpackage/io.py
/Users/calvin/.virtualenvs/learn3/bin/../lib/python3.3/io.py请注意我上面所做的关于
our_package_root = os.path.dirname(os.path.realpath(__file__))
sys.path.append(our_package_root)https://stackoverflow.com/questions/13217005
复制相似问题