👾前言👾
Python语言语法灰常的简单,大家也许被他的语法和成千上万个优秀的第三方库迷惑的不要不要的,Python的包管理工具没有像Java的Maven那样成熟,直接导入即可。如果不知道Python的一些包管理底层原理可能会在项目配置项目搭建上因为包的导入导出而费尽心思。今天就对Python底层的包管理进行一下剖析。然后讲一下导包常遇见的问题以及如何对项目进行打包。
🍁前置知识(目标)🍁
- 理解包与模块的概念与区别
- 理解运行时导包的顺序,Python解释器如何解析包
- 掌握查看包、模块相关信息的函数
🤺为什么需要将程序模块化?🤺
💫开发的便利性而言
在日常进行程序开发的时候,如果项目很大不对程序进行模块化处理就会导致如果前一部分工作没有进展,则后续的工作更加无法进展。即使有再多的技术人员也无尽于事。如果将程序模块化后,分工给具体的人。则可以同时进行开发,最后对程序进行简单的组合即可。时间上互不影响。效率大大提升。 |
💫软件后期升级与维护而言
软件工程中一直流行一种思想“高内聚,低耦合”。使用这样的思想开发出的软件更加有利于后期的维护。高内聚就是各个模块内部应该紧密联系,减少不必要的代码。低耦合指的就是模块化,每个模块干啥事应该事先规定好。并且模块间依赖关系不要那么强。这样可以把程序的功能像插销与插座一样进行插拔。从而有利于后期的维护与更新。 |
🤺Python包管理工具pip🤺
💫简介
Python有成千上万的宝藏库,这些库相当于是已经集成好的工具,只要安装就能在Python里使用。 它们可以处理各式各样的问题,无需你再造轮子,而且随着社区的不断更新维护,有些库越来越强大,几乎能媲美企业级应用。 怎么下载安装呢?它们被放在一个统一的“仓库”里,名叫PyPi(Python Package Index),所有的库安装都是从这里调度。 有了仓库之后,还需要有管理员,pip就是这样一个角色。使用pip进行库的安装的时候默认是去外网下载的。所以大家有些库可能会安装不成功。有两种解决方式:一、科学上网 二、替换镜像源。 |
pip会默认将install的包安装到当前用户的工作目录下。解释器在进行导包搜索的时候现在当前目录搜索,再去操作系统环境变量PYTHONPATH指定的路径中搜索,最后去Python标准库搜索。有可能会出现用户工作目录中的包在py文件中无法使用的情况,这时候需要我们手动的把相应的包移动到Python的安装目录下的py+版本号\Lib\site-packages中。或者指定包的安装目录。 pip install -t py安装路径\Lib\site-packages 包名 |
💫常用的指令
🥴升级pip版本
pip install --upgrade pip
🥴常规库的安装
pip install 库名
🥴指定库的版本安装
pip install 库名==版本号
🥴卸载已安装的库
pip uninstall 库名
🥴列出已经安装的库
pip list
🥴将已经安装的库列表保存到文本文件中
pip freeze > 文件名
🤺模块与包🤺
💫基本概念
什么是模块? | 模块指的是一块具有共同特点的代码。在Python中一个模块就是一个.py文件。Python的内置模块是用C语言编写的程序,可以使用C/C++扩展编写模块。 | 什么是包? | 在Python中包就是一个文件夹,一个包中可以包含很多子包。每个包中至少包含一个__init__.py文件,在进行导包的时候首先执行__init__.py文件。 | .pyc文件是干嘛的? | 每个包中在被导入之后都会生成一个__pycache__文件夹。内部包含.pyc文件。.pyc结尾的文件是一个编译后的字节码文件。下次导包的时候会根据.py与.pyc的时间戳进行对比。如果没有修改就直接通过.pyc文件导入。生成.pyc文件是自动的,不需要程序员插手。 |
💫几种常见的导包方式
普及一个小知识
成员作用符(C++中指的是某对象的某成员) (Python中用于限定某模块中的某方法或函数、类) . 域作用符(C++指某个命名空间下的某个类)(Python中目前木有见过) : :
🥴1.导入模块
import math
math.pi
🥴2.从包中导入模块
from http import server
print(server.__name__)
🥴3.从包中导入模块中的元素
from http.server import __name__
print(__name__)
🤺运行时包、模块的管理🤺
💫什么时间导包?按什么顺序导包
Python解释器在主程序运行开始的时候将所有要用到的包导入。如果多次导入仅仅只会执行包内的代码一次。如果不重新加载包或动态导包。那么旧包中的内容更新后运行中的Python程序不会感受到。导包的搜索顺序一般如下: |
- 当前目录
- 操作系统环境变量PYTHONPATH
- Python标准库目录
- sys.path 这是一个列表,搜索包的时候会迭代这个列表中的所有路径(可以人为的向列表中添加路径)
一般结合sys.path[0]------当前工作路径使用。可以自定义包的位置
值得注意的是:sys.path[0]并不会随着代码所在的模块改变而改变(sys.path[0]存的是主程序文件所在的路径) 主程序就是__name__==__main__的程序(也就是运行入口模块),普通模块的__name__是自己的模块名。 导包的时候会先将被导包程序中的代码运行一遍(除被导入模块中__name__=="__main__"下面的代码)
💫重新加载包
import importlib
import 我的包名
importlib.reload(我的包名)
💫动态导包(运行过程中导包)
导包时程序刚开始运行时候的工作,如果当时不进行包的导入可以后期动态的通过该方法进行导包,import 关键字底层调用的也是这个函数进行导包。 |
动态导包使用的是__import__(),直接将要导入的包名(字符串形式)传进函数内即可。 eg:
m=__import__("sys")
🤺打包项目🤺
可以使用pip install PyInstaller 安装打包工具 然后切换到你要打包项目的主程序所在的目录,使用pyinstaller -F 文件所在的路径打包.py文件 (-F是只生成一个可执行文件) |
|