我最近决定升级到 python 3,并开始转换我的一些脚本。我在使用名为 - 在 python 2 中的模块的脚本中遇到了一个问题io
,这很好,但是在 python 3 中,io
它是文件的标准模块。我发现了这个关于同一类型问题的老问题,但这似乎与python 2有关。我有相反的问题 - 给定两个文件,main.py
在io.py
顶级包import io
中,main.py
将导入标准io
模块,而不是本地模块一。from __future__ import absolute_imports
没有帮助,并且from . import io
并且相关尝试按预期失败(我从来没有理解过 - python 真的不知道顶级包在哪里?)。重命名显然是一种解决方案,但如果可能的话,我想避免它。是否有一些解决模块名称冲突的python 3标准方法?
问问题
2245 次
1 回答
0
这是我的答案:-
我的目录结构:-
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)
于 2012-11-04T09:12:44.383 回答