基础问题 Python 包导入错误

2013-08-10 22:17:58 +08:00
 tioover
http://segmentfault.com/q/1010000000263255

这个一直没搞明白……虽然感觉是很小白的问题。
4570 次点击
所在节点    Python
12 条回复
thedevil5032
2013-08-10 22:52:17 +08:00
tioover
2013-08-10 23:17:52 +08:00
@thedevil5032 这样有点丑……
iEverX
2013-08-10 23:52:11 +08:00
python3 a.py,则a.py是最顶级的模块,只能找到b.py以及__init__.py,不知道test是个什么东西,所以。。
而后面的 from . import b,这种引用,由于a.py是作为__main__的,是不允许的

http://stackoverflow.com/questions/72852/how-to-do-relative-imports-in-python
reorx
2013-08-11 00:29:41 +08:00
1. segmentfault 中 felix021 和 detailyang 的回答都是错误的(依云的答案是对的),对包内模块的引用使用 from b import c 的形式是绝对错误的,仅有 from .b import c 和 from test.b import c 是正确的。

2. 之所以没找到 test 包是因为你在 test/ 下运行 a.py,test/ 的确在系统路径中,但 test/ 的上级目录不在,所以 test/ 依然是找不到的。包内模块作为运行入口本就不是好的选择,最佳实践方案应该是单独写一个脚本 from test import a 来做些什么,或者在 test/ 的上级目录运行 python -m test.a,这样将包整个进行调用,避免在包内直接运行。

2. 看一下 pep 328
reorx
2013-08-11 00:32:41 +08:00
补充一点在 test/a.py 中 from b import c 或者 import b 之所以是错的,是因为这样是把 b 当作模块命名空间的顶级,也就是包来调用,而 b 只是 test 包中的模块,因此极为容易引发各种错乱。
tioover
2013-08-11 00:44:54 +08:00
@reorx
@iEverX
感谢!
felix021
2013-08-11 00:55:51 +08:00
reorx
2013-08-11 11:38:29 +08:00
@felix021 嗯,不过2和3在包和模块的引用方式这块应该遵循的是同一理念。
reorx
2013-08-11 11:42:35 +08:00
@felix021 竟然是同院校友,震惊泪目!我是09,你是哪一届的?
felix021
2013-08-11 22:36:49 +08:00
@reorx 所以是05级的师兄?我是06级/10届的……
reorx
2013-08-11 23:21:52 +08:00
@felix021 我是09级/13届的……哈哈,你是师兄才对 XD
felix021
2013-08-12 08:59:14 +08:00
@reorx 这么说来我给你们上过课,OJ系统使用的,不过你可能逃课了吧~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/78693

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX