我已经回答了一个关于Python绝对导入的问题,我认为我在阅读Python 2.5更新日志和随附的PEP时理解了这一点.但是,在安装Python 2.5并尝试制作正确使用的示例时from __future__ import absolute_import,我意识到事情并不那么清楚.
直接从上面链接的更改日志,这句话准确地总结了我对绝对导入更改的理解:
假设你有一个像这样的包目录:
Run Code Online (Sandbox Code Playgroud)pkg/ pkg/__init__.py pkg/main.py pkg/string.py这定义了一个名为
pkg包含pkg.main和pkg.string子模块的包.考虑main.py模块中的代码.如果它执行语句会发生什么
import string?在Python 2.4和更早的版本,它会先在包的目录进行相对进口看,发现包装/ string.py,导入该文件的内容pkg.string模块,并且该模块被绑定到名字"string"的pkg.main模块的名称空间.
所以我创建了这个确切的目录结构:
$ ls -R
.:
pkg/
./pkg:
__init__.py main.py string.py
Run Code Online (Sandbox Code Playgroud)
__init__.py并且string.py是空的.main.py包含以下代码:
import string
print string.ascii_uppercase
Run Code Online (Sandbox Code Playgroud)
正如所料,使用Python 2.5运行它失败了AttributeError:
$ python2.5 pkg/main.py
Traceback (most recent call last):
File "pkg/main.py", line 2, in <module>
print string.ascii_uppercase
AttributeError: …Run Code Online (Sandbox Code Playgroud) 我按照Python Central上的简易指南为我的代码创建一个包:
https://www.pythoncentral.io/how-to-create-a-python-package/
所以我的目录结构是:
main.py
pack1/
__init__.py
Class1.py
Run Code Online (Sandbox Code Playgroud)
在main.py我导入和使用的文件Class1中:
from pack1 import Class1
var1 = Class1()
Run Code Online (Sandbox Code Playgroud)
在__init__.py我写的文件中:
import Class1 from Class1
Run Code Online (Sandbox Code Playgroud)
我完全按照指南,仍然得到错误:
ModuleNotFoundError: No module named 'Class1' (in __init__.py)
Run Code Online (Sandbox Code Playgroud) 以下是我的项目的结构:
\nPython_Projects/\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 project_1/\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 my_functions.py\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 test.py\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 sub_folder_add/\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 add.py\nRun Code Online (Sandbox Code Playgroud)\nadd.py中的代码:
\nfrom .my_functions import addition\nRun Code Online (Sandbox Code Playgroud)\n运行code.py时出现错误:
\n\n\nImportError:尝试在没有已知父包的情况下进行相对导入
\n