在某次运行过程中出现了如下两个报错: 报错1: 于是基于这两个报错探究了一下python3中的模块相互引用的问题,下面来逐个解析,请耐心看完。 好的,我们先来构造第一个错: 测试代码结构如下:
此时运行 问题原因: 主要在于引用src_test2模块的时候,用的是相对路径".",在import语法中翻译成"./",也就是当前目录下,按这样理解也没有问题,那为什么报错呢? 从 PEP 328 中,我们找到了关于 the relative imports(相对引用)的介绍 通俗一点意思就是,你程序入口运行的那个模块,就默认为主模块,他的name就是'main’,然后会将本模块import中的点(.)替换成 解决方法: 因此,建议的做法是在 src同层级目录创建 引用模块
执行报错: 问题原因: 当执行test_src时,按上文理解,此时执行文件所在的目录为根目录,那么引用test1的时候,需要注意的是,此时test1的name属性不再是src.src_test1,因为程序感知不到src的存在,此时他的绝对路径是 src_test1,此时再次引用相对路径查找的test2,同样的步骤,需要先找到父节点,而此时他自己就是根节点了,已经没有父节点了,因此报错“no known parent package”。 解决方法: 此时为了避免父节点产生矛盾,因此将test1中的引入去掉相对引用即可
继续深入: 那使用相对路径和绝对路径,编译器是怎么找到这个模块的呢? 执行import的时候,存在一个引入的顺序,即优先查找执行目录下有没有此文件,如没有,再查找lib库下,如还没有,再查找sys.path中的路径,如再没有,报错。 所以不管是当前目录,还是 sys.path中的目录,都可以查到 src_test2这个模块,就可以编译成功。 号外: 解决完上述问题后,不管我们用哪种方式,我们调试代码时,都是单个文件调试,但此时根目录就不对了,import方式又要改动,执行起来很麻烦,所以这里推荐另一种方式(有更好的方式欢迎留言),使用
使用append的方式,将程序文件根目录放进了sys.path中,然后再引用绝对路径,这样的方式,不管使用上文中的第一或第二执行方式都可以调用,也可以单独编译test1文件,不用修改import路径,也是相对安全的方式。但是缺点就是,如果你修改了某一个包名,需要将所有引用地方都修改一下,工作量大,所以因地制宜。 综上,详细讲解了相对路径和绝对路径的引用方法,现在你应该对import导入的问题有了清晰的理解吧 |
|
来自: python学习者 > 《python文章》