大家好!我是虎哥之前一直抗拒使用Python,很大一部分原因是Python项目的环境管理比较混乱。Node.js有Npm包管理工具,通过package.json配置项目依赖,最多通过nvm切换环境;Java有MavenGradle进行包管理和项目依赖配置,体现在pom.xml和build.gradle等中间。与编程语言相比,Python有时会体现出脚本语言的特点,系统化、规范化程度不是很高。很多Python项目拿出代码,并没有声明依赖和配置环境的文件。这样做的好处是简单的项目很快就堆起来了,但是一旦代码量变大,依赖管理、环境配置、项目启动就会处处坑坑洼洼。但是稍微了解之后,我发现Python不仅仅可以作为脚本语言来使用。基于一定的工具链,Python也可以写出漂亮标准的项目代码,清楚地了解环境和依赖关系。基于PIP的最基本的依赖管理应该可以解决以下问题:快速配置项目依赖,搭建良好的开发环境。清楚知道当前项目依赖了哪些第三方包,以及它们的依赖树。可以快速添加和删除给定的依赖项并执行依赖项调解。这些函数其实使用pip工具链是非常方便的。快速配置环境(pip)如果想简单预览当前环境下的依赖包,可以直接使用piplist命令:$piplistPackageVersion-------------------------------certifi2020.6.20pip19.3.1setuptools44.0.0.post20200106wheel0.36.2空的Python环境,基础一般只有这四个包。这样我们就知道了当前环境中有哪些包以及它们的版本。为了方便说明,先引用一些依赖pipinstallflask。$piplistPackageVersion----------------------------certifi2020.6.20click7.1.2Flask1.1.2itsdangerous1.1.0Jinja22.11。3MarkupSafe1.1.1pip19.3.1setuptools44.0.0.post20200106Werkzeug1.0.1wheel0.36.2安装完Flask后发现除了Flask,他还引入了几个间接依赖。如果我们要记录这些信息,可以使用pipfreeze命令,记录在requirements.txt(约定俗成的名字)中。$pipfreeze>requirements.txt$catrequirements.txtcertifi==2020.6.20click==7.1.2Flask==1.1.2itsdangerous==1.1.0Jinja2==2.11.3MarkupSafe==1.1.1Werkzeug==1.0.1好的,制作这个文件的注释。如果以后需要在新的Python环境中引入当前的依赖,只需要使用pipinstall-rrequirements.txt即可。Clearprojectdependencies(pipdeptree)piplist或者pipfreeze打印的依赖有问题,就是没有明确的依赖。这样做的缺点是,当我们要清理依赖时,不知道哪些依赖可以直接删除,哪些依赖是间接依赖,不能轻易删除。比如我们在项目中可能使用了Flask,但是我们可能并不知道Flask也引用了Jinja2。这是如果我们擅自删除Jinja2,项目可能无法运行。..这时候可以使用pipdeptree工具来管理依赖树:$pipinstallpipdeptree...$pipdeptreecertifi==2020.6.20Flask==1.1.2-点击【要求:>=5.1,安装:7.1.2】-itsdangerous[要求:>=0.24,安装:1.1.0]-Jinja2[要求:>=2.10.1,安装:2.11.3]-MarkupSafe[要求:>=0.23,安装:1.1.1]-Werkzeug[required:>=0.15,installed:1.0.1]pipdeptree==2.0.0-pip[required:>=6.0.0,installed:19.3.1]setuptools==44.0.0.post20200106wheel==0.36.2现在我们知道了,原来Jinja2是依赖Flask的,所以我们就不随便删了。..项目依赖治理(pip-autoremove)那么问题来了,如果突然不想依赖Flask了,怎么办?简单的方法是pipuninstallflask-y。不是很明显,这并不优雅:$pipuninstallflask-y...$pipdeptreecertifi==2020.6.20click==7.1.2itsdangerous==1.1.0Jinja2==2.11.3-MarkupSafe[要求:>=0.23,已安装:1.1.1]pipdeptree==2.0.0-pip[required:>=6.0.0,installed:19.3.1]setuptools==44.0.0.post20200106Werkzeug==1.0.1wheel==0.36.2发现没有,虽然Flask已经卸载,其依赖包没有卸载干净。剩下的包你可能需要一个一个判断是否需要,然后递归删除。..幸运的是,我们可以使用pip-autoremove工具来做到这一点。让我们重新安装Flask并尝试使用此工具将其删除:$pipinstallflask$pipinstallpip-autoremove$pip-autoremoveflask-y$pipdeptreecertifi==2020.6.20pip-autoremove==0.9.1pipdeptree==2.0.0-pip[要求:>=6.0.0,已安装:19.3.1]setuptools==44.0.0.post20200106wheel==0.36.2这是干净的
