
不是,虽然在成功导入不报错的地方看起来就是当前包。
但只是看起来。
为什么这么说?
导入成功是有条件的,不是只要文件在当前这个包内,用from . import xxx就可以导入。
举一个反例吧~很简单的结构:1个目录下2个文件
文件内容如下:
第一次用文件名导入,没有问题,正常输出:
下面改一下importer.py:
就报错了:
分明是从当前包导入,却不成功。
所以一上是在回答为什么.不是简单粗暴地用当前包就可以。
接下来,说一下,点是什么含义.
官网的解释是:
包内的文件相互导入分两种,用绝对路径和相对路径,用.或者..都是第二种,相对路径。
重点是,相对导入的路径依赖于当前模块的_name_,是根据它的值去找平级或者上级文件。
刚才那个例子为什么不成功?我们来看一下_name__的值:
结果是:
!
正常应该是aa.bb.py,这样python解释器就会知道所在目录叫做aa了。
而_main__,你说所在目录是什么呢?
所以说,从物理上来说,这两个文件确实都在同一个目录下,但仅此就认为from . import xxx一定可以把另一个文件导进来,不对。关键在于,能不能识别到。
最后修改一下,让导入成功:
参考 6. Modules - Python 3.6.6 documentation
最后补充一下,看到好几个答案里提到_init_.py的问题。
虽然根据手册必须有这个文件的文件夹才能算作package,并且按照手册的说法这种相对引入的方式本身就是intra-package所以前提一定要是package,所以一定要有这个_init_.py才行。
但是在python3.6上试验,没有_init_.py并不会影响相对导入的方式。
