模块导入 python3 而不是 python2

Module imports on python3 not python2

我有一个文件结构如下的项目:

test/
    test.py
    extra/
        stuff.py
        __init.py__

test.py 的代码很简单:

import sys
sys.path.append("/path/to/test")
import extra

这愉快地 运行s 使用 python3 test.py,但不会 运行 在 python 2.7 中,我完全被难住了话题。

python2.7给出的错误是

 Traceback (most recent call last):
   File "test.py", line 3, in <module>
    import extra
ImportError: No module named extra

感谢您的帮助!

这是复制粘贴自: http://python3porting.com/differences.html

在 Python 2 中,如果您有一个名为 mypackage 的包并且包含一个名为 csv.py 的模块,它会从标准库中隐藏 csv 模块。代码 import csv 将在 mypackage 中导入本地文件,从标准库导入将变得棘手。

在 Python 3 中,这已更改,因此 import csv 将从标准库导入,而要导入本地 csv.py 文件,您需要编写 from . import csv 和 from csv import my_csv 需要更改为 from .csv import my_csv。这些被称为“相对导入”,还有一种语法可以从上面的上一级模块导入;从 .. 导入 csv.

如果您同时支持 Python 2 和 Python 3 而没有 2to3 的 from 。和 from .. 语法从 Python 2.5 开始可用,连同 from future import absolute_import 语句将行为更改为 Python 3行为。

如果您需要支持 Python 2.4 或更早版本,您必须拼出整个包名称,因此 import csv 变为 from mypkg import csv 而 from csv import my_csv 变为 from mypckg.csv 导入 my_csv。为了清晰和可读性,如果可以的话,我会避免相对导入,并且总是拼出整个路径。

2to3 将检查您的导入是否是本地的并进行更改。

简而言之,Python2 允许您逃避相对导入,python3 不能。