TL; DR:您不能从您执行的文件中执行相对导入,因为__main__模块不是包的一部分.
绝对导入 – 导入sys.path上可用的内容
相对导入 – 相对于当前模块导入某些内容,必须是包的一部分
如果您以完全相同的方式运行两个变体,其中一个应该可以工作.无论如何,这里有一个例子可以帮助你理解发生了什么,让我们添加另一个main.py文件,其整体目录结构如下:
.
./main.py
./ryan/__init__.py
./ryan/config.py
./ryan/test.py
让我们更新test.py来看看发生了什么:
# config.py
debug = True
# test.py
print(__name__)
try:
# Trying to find module in the parent package
from . import config
print(config.debug)
del config
except ImportError:
print('Relative import failed')
try:
# Trying to find module on sys.path
import config
print(config.debug)
except ModuleNotFoundError:
print('Absolute import failed')
# main.py
import ryan.test
我们先运行test.py:
$python ryan/test.py
__main__
Relative import failed
True
这里的“test”是__main__模块,并且不知道属于某个包的任何信息.但是导入配置应该可以工作,因为ryan文件夹将被添加到sys.path中.
让我们运行main.py:
$python main.py
ryan.test
True
Absolute import failed
这里测试是在“ryan”包中,可以执行相对导入.导入配置失败,因为Python 3中不允许隐式相对导入.
希望这有帮助.
P.S.:如果您坚持使用Python 3,则__init__.py文件中不再需要它.