我有一个具有以下文件结构的项目:
test/
test.py
extra/
stuff.py
__init.py__
test.py的代码很简单:
import sys
sys.path.append("/path/to/test")
import extra
这很愉快地使用python3 test.py
运行,但不会在python 2.7中运行,而且我已经阅读了很多关于该主题的问题而感到非常难过。
python 2.7给出的错误是
Traceback (most recent call last):
File "test.py", line 3, in <module>
import extra
ImportError: No module named extra
感谢您的帮助!
答案 0 :(得分:0)
这是来自:的复制粘贴 http://python3porting.com/differences.html
在Python 2中,如果你有一个名为mypackage的包并且包含一个名为csv.py的模块,它会隐藏标准库中的csv模块。代码导入csv将在mypackage中导入本地文件,从标准库导入将变得棘手。
在Python 3中,这已经改变,因此import csv将从标准库导入,并导入您需要编写的本地csv.py文件。 import csv和csv import my_csv需要从.csv import my_csv更改为。这些被称为“相对导入”,并且还有一种语法可以从上面的一个级别向上导入模块;来自.. import csv。
如果你支持Python 2和Python 3而不支持2to3。从Python 2.5开始提供from语法,以及来自 future import absolute_import语句,该语句将行为更改为Python 3行为。
如果您需要支持Python 2.4或更早版本,则必须拼出整个软件包名称,以便从mypkg import csv和csv import my_csv导入csv变为mypckg.csv import my_csv。为了清晰和可读性,如果可以并且总是拼出整个路径,我会避免相对进口。
2to3将检查您的导入是否为本地导入并进行更改。
简而言之,Python2允许你逃避相对导入,python3 不会。