python模块导入细节解析

目录

 

 

(一)import导入方式

(二)不同文件的sys.path分析

 (三)from import 方式

(四)from 包 import * 要注意

(五)相对与绝对导入:

(六)import导入自定义包的子模块:

 (七)导入自定义包用import demo01_test02报错  的  解决方法

 (八)pycharm导入包路径

(九) 包的单独导入


 

(一)import导入方式

注意:单独用import可以再降级

(二)不同文件的sys.path分析

import 语句找python1224.demo01.demo01_test01,就先从path列表第一项路径开始找,找不到就报错

 (三)from import 方式

(四)from 包 import * 要注意

 import * 要在__init__.py中配置允许使用的模块,用__all__配置,没在里面的,不管是简单变量还是啥,都不能导入成功

 解决方法,在demo01下的__init__.py作如下操作:

 其实还有一种方法,跟第九项的单独导入解决方法一样,在__init__.py写入下图东东一样可以:

(五)相对与绝对导入:

我们的最顶级包base是写给别人用的,然后在base包内部也会有彼此之间互相导入的需求,这时候就有绝对导入和相对导入两种方式:

绝对导入:以base作为起始    

相对导入:用.或者..的方式最为起始(只能在一个包中使用,不能用于不同目录内)

1.绝对导入

 

2.相对导入

相对路径运行注意事项:

 若不在demo04_test01.py直接点击运行,而是在另一个文件(比如all_to_test)中调用demo04_test01.py且

demo04_test01.py也有相当对导入“..”是可以的.

(六)import导入自定义包的子模块:

 注意:all_to_test.py是与demo01, demo02, demo03,同级的在python1224包下的模块

 

 上图能运行的原因:执行demo01.test01,到了import这句,解释器会搜索路径去查找demo01.test02,正好他俩是邻居

,都在demo01下(看红圈),用本文件的路径也能找到demo01.test02,所以能执行。如果我们在all_to_test中调用了demo01_test01.py,就会出错了,因为这时候的sys.path,就是all_to_test.py的了,找不到demo01.test02.py了,所以报错

注意:无论print(sys.path)在哪,打出的路径,一定是你执行的那个模块的路径,比如print(sys.path)是在demo01_test01.py中,

但all_to_test.py调用了demo01_test01.py,而all_to_test.py本身没有print(sys.path),执行all_to_test.py时,也会打印lujing

路径,而且打印出的是all_to_test.py的路径,并非demo01_test01.py的路径。

 (七)导入自定义包用import demo01_test02报错  的  解决方法

他报错的原因无非就是在上图打印出的路径中找不到demo01_test02罢了,其实我们可以人为添上他的路径。。。

 这种添加路径以后必用,在这里理解一下。但导包基本不这样用,from .. import 这种相对导入,和绝对导入用的多。

 (八)pycharm导入包路径

上面的方法成功解决了问题,然而还有简便方法——pycharm之点点点,原理也是添加了路径'D:\\pythonworkspace\\包和模块\\python1224\\demo01',不过是通过点击完成的。

步骤:File-->settings 然后照着这个图点就好了:

注释掉上一题的解决方法,我们发现一样可以,而且路径也添加在all_to-test的路径上了:

想删掉的话,再重复步骤,找到最右边那个shource folders点个×就好了

(九) 包的单独导入

之前用的东西全都不用管,wome我们用新包demo04,all_to_test也清空重写,各文件内容请看:

 接下来执行all_to_test,结果如下图:

 为什么报错呢?,因为只导入到包,import时不会讲包里的模块加载到内存的。但是我们之前说过,一个包只要导入了,

包的__init__.py会自动执行,这里就要用到他了,在__init__.py里导入下面两个模块就好了

 

 解决方法:

 

猜你喜欢

转载自blog.csdn.net/sinat_38068807/article/details/86188572
今日推荐