比如说
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']
python3的话,这种情况,直接在a.py里写:
import b
就可以了~
因为
作者用的python3,与2不同,参考楼上的答案吧。a.py
在test包内,你只要 from b import c
就行了。
凡是在相应文件夹下存在init.py都将被认为是一个包 对于a.py想引用b.py,由于在同一包里,只需 from b import c 或者import b即可.
误人子弟了...确实是错的.
你的 test 的上级目录不在 sys.path
中。
还有,不要直接执行一个包里边的文件。如果真需要执行一个包里的模块(而又不使用 distribute 提供的 entry point 安装配置),请使用 python3 -m test.a
这样子。