python小课堂15 - 史上最详细的包和模块import讲解篇
前言
在大量的代码设计中,我们不可能将所有代码都写在一个.py文件,所以有了包、模块,而为了代码可以重复利用(复用性),就有了类、函数的概念。类和函数在下次介绍。
python中的包
python中的包,对应到计算机中,可以理解为文件夹,但是文件加下必须有一个名为__init__.py的文件,若没有此文件,python则会认为其只是一个普通的文件夹。
打开pycharm,创建一个包,如下:
python中的模块
python中的模块就非常好理解了,实际上,之前所有的.py文件,我们都可以称之为一个模块。单独的一个py文件就是一个模块。
test1和test2不同区别就是test2是和package这个包是同级目录,而test1是属于package包的。
再来看下总的概念:
包和模块的引入
1.模块处于同级目录(并且不在包下 )
当我们想在一个模块中使用另一个模块中的变量时,如何操作呢?test2、test3处于同一级目录。
我想在test3中引入test2的变量,test2.py中有个变量a = 2。
如上所示,只需要在当前模块,用import语句,即可导入模块,具体使用的时候需要用模块的名字.变量。
import 后面必须是模块的名称! ------> import modul name
还有一种写法如下图pycharm中:
如上所示,只需要在当前模块, from 模块名字 import 变量
2.模块处于同级目录(在同一包下)
来看下,test1,test4都属于package包下的模块。
test1.py中有着字符串a = 'I am success!'
在test4.py中引用test1.py中的a,如何引用呢?
可以看到如下:
关键语法:import 包名.模块名 as 别名
但是!!!!!!!如果我们脱离pycharm,找到本机相应的python目录,通过cmd来运行下,看下效果如何:
可以清晰的看到上图,通过命令行模式执行就会报错!错误显示模块没有被找到:没有模块叫'package'。这是为什么呢?在pycharm中通过右键run as运行test4,可以看到控制台成功输出,而本地调用命令行的形式就报错了!
打开pycharm的setting,搜索 python console,右侧其中有一项,add content roots to pythonpath,默认pycharm是勾选上此项的。此项的意思是将内容的根路径加到python的环境变量路径下。
可以看到上图下面代码块里写着一堆代码,正是这段代码,我们才可以在pycharm中正确运行。
我们可以在test1.py里来看下sys.path,顺便打印看下结果。
pycharm控制台输出:
['F:\\pycharm\\python14\\package', 'F:\\pycharm\\python14',
'D:\\python3.6\\python36.zip',
'D:\\python3.6\\DLLs', 'D:\\python3.6\\lib', 'D:\\python3.6',
'C:\\Users\\sy\\AppData\\Roaming\\Python\\Python36\\site-packages',
'D:\\python3.6\\lib\\site-packages',
'D:\\python3.6\\lib\\site-packages\\win32',
'D:\\python3.6\\lib\\site-packages\\win32\\lib',
'D:\\python3.6\\lib\\site-packages\\Pythonwin']
实际通过命令行输出,应该没有'F:\pycharm\python14' 这一项,因为这一项是pycharm中setting自动加上的!
实际控制台输出:
['F:\\pycharm\\python14\\package',
'D:\\python3.6\\python36.zip',
'D:\\python3.6\\DLLs', 'D:\\python3.6\\lib', 'D:\\python3.6',
'C:\\Users\\sy\\AppData\\Roaming\\Python\\Python36\\site-packages',
'D:\\python3.6\\lib\\site-packages',
'D:\\python3.6\\lib\\site-packages\\win32',
'D:\\python3.6\\lib\\site-packages\\win32\\lib',
'D:\\python3.6\\lib\\site-packages\\Pythonwin']
sys.path是一个list。默然情况下python导入文件或者模块的话,他会先在sys.path里找模块的路径。如果没有的话,程序就会报错。可以看到,sys路径下有package的包名,而没有test4.py中引用test1.py模块。
而pycharm能够成功运行,正是因为它已经帮我们把项目的根路径添加到了python的环境变量中。所以我们仿照其类似写法也可以完成!
解决方案:
这里不得不说几个重要的python自带模块了,如下:
①
__file__ : python模块自身的名称 pycharm打印下__file__:
可以看到pycharm会将模块的绝对路径输出到控制台上。
在用命令行执行下看看:
python额外小知识:可以看到上图有一个__pycache__的文件夹,这个文件夹在pycharm的目录中,我们是看不到的,那么此文件夹的意义何在呢?点进去看下: