素材牛VIP会员
Python 包导入错误
 非***扰  分类:Python  人气:762  回帖:4  发布于6年前 收藏

比如说

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']
 标签:python

讨论这个帖子(4)垃圾回帖将一律封号处理……

Lv6 码匠
飞***猪 交互设计师 6年前#1

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

Lv6 码匠
雪***儿 职业无 6年前#2

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

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

Lv3 码奴
上***水 职业无 6年前#3

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

Lv5 码农
牛***满 产品经理 6年前#4

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

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取