2

比如说

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']

4个回答

7

已采纳

你的 test 的上级目录不在 sys.path 中。

还有,不要直接执行一个包里边的文件。如果真需要执行一个包里的模块(而又不使用 distribute 提供的 entry point 安装配置),请使用 python3 -m test.a 这样子。

0

因为a.py在test包内,你只要 from b import c 就行了。 作者用的python3,与2不同,参考楼上的答案吧。

0

python3的话,这种情况,直接在a.py里写:
import b
就可以了~

-1

凡是在相应文件夹下存在init.py都将被认为是一个包 对于a.py想引用b.py,由于在同一包里,只需 from b import c 或者import b即可. 误人子弟了...确实是错的.

撰写答案