Python 3包模块与标准模块冲突

时间:2012-11-04 07:53:28

标签: python python-3.x python-2.x

我最近决定升级到python 3,并开始转换我的一些脚本。我在使用名为io的模块的脚本中遇到了问题 - 在python 2中,这非常好,但是在python 3中,io是文件的标准模块。我发现this old question有关同一类问题,但这似乎是对python 2的引用。我遇到了相反的问题 - 给出了顶级的两个文件main.pyio.py包{},import io中的main.py将导入标准io模块,而不是本地模块。 from __future__ import absolute_imports没有帮助,from . import io和相关的尝试失败了(我从未理解过 - python真的不知道顶级包在哪里?)。重命名显然是一种解决方案,但如果可能的话,我想避免它。是否有一些python 3标准方法解决模块名称冲突?

1 个答案:

答案 0 :(得分: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)