Python学习
一、学前花絮
我们已经学习了python编程很多的知识,包括基础知识、高级进阶方面的,还有很多的示例。到现在为止,我们已经能够开发一个标准的工程项目了。比如这个项目包括BS架构下前后端程序的数据交互(我们有文章专门讲过双向如何交互数据),数据存储到mysql数据库或者文件(这些内容我们也有文章示例)。后来还讲了配置文件的处理。
那么问题来了,这个项目按照模块化原则,我们要划分成多个子目录或者多个文件,这些大大小小数十个python文件可能需要多个依赖(比如import或者from X import),我们在移植这个项目的时候,一定要把依赖包也移植过去。
如果导出所在项目下所有文件的依赖包(requirements.txt)是一个非常重要的问题。
二、Python项目下的程序移植-requirements.txt
2.1 依赖包文件requirements.txt是什么
生成依赖包文件的命令:
pip freeze > requirements.txt |
在windows的cmd下输入这个命令,我们确实得到了这个文本文件。里面的内容是这样的:

以上知识该文件的一部分,太长了!那么我们很容易想到一个问题,这是我所在的项目必须的依赖包吗?即便我们在自己项目程序中手工对一下,也能发现这些包太多了,肯定不是!那如何精准找到我所在项目程序的依赖包呢?
2.2 pip freeze到底做了什么
lpip freeze 的逻辑非常简单粗暴:“把当前 Python 环境里安装的所有第三方库,不管有用没用,全部列出来。”
l它的视野是全局的:它看到的是整个 Python 环境(解释器)里装了什么,而不是你项目文件夹里写了什么代码。
l目录切换无效:无论你在 Windows 的 D:\project\sub_dir_A 还是 D:\project\sub_dir_B 执行这条命令,只要用的是同一个 Python 环境,生成的 requirements.txt 内容是一模一样的。
也就是说,我们如果习惯用pycharm工具开发python程序,那么我们所有的测试用例包括很多不相关的目录或者文件都在这里,这样我们做测试很方便。只需要根据需要创建新的子目录即可。
而问题也产生了,比如在这个大而混乱的环境里面,我们有一个关于AI的子目录,是关于AI算法开发的。它和其他目录逻辑上没有关系。我们也想移植这个AI目录到生产环境。
针对移植AI目录程序所需依赖包,我们有如下的解决方法。
2.3 方案一【最佳实践】使用虚拟环境(Virtual Environment)
这是 Python 开发的标准做法,也是解决你“环境混乱”问题的终极方案。原理:为你的那个特定“子目录”创建一个独立的“小房间”(虚拟环境),只在这个房间里装项目需要的包。步骤:
1.创建虚拟环境(在你的子目录下):
# 进入你的目标子目录 cd D:\project\your_target_sub_dir # 创建一个名为 venv 的虚拟环境(会生成一个文件夹) python -m venv venv |
2.激活虚拟环境:
# Windows 下执行 venv\Scripts\activate |
此时你的命令行提示符前面会多出 (venv),表示你现在在这个独立的小房间里了。
3.安装依赖:
在这个激活的状态下,安装你这个子目录需要的包:
pip install django requests numpy# 只装这个项目需要的 |
4.生成 requirements.txt:
pip freeze > requirements.txt |
2.4 方案二【补救措施】使用 pipreqs 工具(不推荐长期使用)
如果你无法改变现有环境结构,或者只是想快速导出某个文件夹代码“实际 import 了什么”,可以使用 pipreqs。
原理:扫描你指定文件夹下的 .py 文件,分析里面 import 了哪些库,然后去查版本。
步骤:
1.安装工具:
2.生成依赖(在目标子目录执行):
注意:pipreqs 有时会因为找不到某些包的版本而报错,或者漏掉某些间接依赖(比如你 import A,A 依赖 B,它可能只扫出 A),所以不如虚拟环境法靠谱。
2.5 程序移植
1.先移植python程序
先把项目(整个目录)打包,在windows下用压缩包工具winrar等。再到生产环境解压缩。
如果生产目录是linux系统,解压缩的操作命令是不一样的,python解释器版本也是不同。
2.安装依赖
因为之前已经获得了依赖包文件requirements.txt,在生产环境执行如下命令:
pip install -r requirements.txt |
2.6总结建议

强烈建议你尝试“方案一”。在 Python 开发中,“一个项目一个虚拟环境” 是保持头发浓密的秘诀。
三、小结
通过学习python编写的项目程序移植涉及到依赖包问题,这是在实际工作中会遇到的重要问题。即便不是生成——测试环境之间的迁移,比如你换电脑了,也是需要解决程序依赖包问题。
让我们保持学习热情,多做练习。我们下期再见!