python中 from . import ×××的那个点是表示当前包吗?

python中 from . import ×××的那个点是表示当前包吗?

不是,虽然在成功导入不报错的地方看起来就是当前包。

但只是看起来。

为什么这么说?

导入成功是有条件的,不是只要文件在当前这个包内,用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并不会影响相对导入的方式。