比如说
test
|-- a.py
|-- b.py
`-- __init__.py
a.py
from test.b import c
print(c)
b.py
c = "test"
运行 a.py
python3 a.py
出错
Traceback (most recent call last):
File "a.py", line 1, in
from test.b import c
ImportError: No module named 'test.b'
我是看官方文档的: https://docspy3zh.readthedocs.org/en/latest/tutorial/modules.html#tut-packages
为什么test
没有被当成一个包呢?脚本所在的文件夹应该在搜索路径里面的呀。
虽然直接import 也行,但是用包组织似乎更推荐?
如果说因为是包内平级的模块不行,但是文档里面说可以用语句来导入的: https://docspy3zh.readthedocs.org/en/latest/tutorial/modules.html#id18
然而将a.py
改成:
from . import b
print(b.c)
依然报错。
Traceback (most recent call last):
File "a.py", line 1, in
from . import b
SystemError: Parent module '' not loaded, cannot perform relative import
将 a.py 改写成
import sys
print(sys.path)
输出:
['/home/tioover/.proj/test', '/usr/lib/python3.3/site-packages/Pectin-0.9-py3.3.egg', '/usr/lib/python33.zip', '/usr/lib/python3.3', '/usr/lib/python3.3/plat-linux', '/usr/lib/python3.3/lib-dynload', '/usr/lib/python3.3/site-packages', '/usr/lib/python3.3/site-packages/setuptools-0.6c11.egg-info']
你的 test 的上级目录不在
sys.path
中。还有,不要直接执行一个包里边的文件。如果真需要执行一个包里的模块(而又不使用 distribute 提供的 entry point 安装配置),请使用
python3 -m test.a
这样子。