目录
(七)导入自定义包用import demo01_test02报错 的 解决方法
(一)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里导入下面两个模块就好了
解决方法: