找回密码
 会员注册
查看: 29|回复: 0

最强解释!Python包的依赖管理,有解了!

[复制链接]

2万

主题

0

回帖

6万

积分

超级版主

积分
64454
发表于 2024-9-12 14:28:10 | 显示全部楼层 |阅读模式
之前一直比较抵触用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.21234567对于一个空的Python环境,基础一般只会有这四个包。我们这样就知道了当前环境中有哪些包,以及他们的版本。为了方便说明,我们先多引一些依赖pipinstallflask。$piplistPackageVersion-------------------------------certifi2020.6.20click7.1.2Flask1.1.2itsdangerous1.1.0Jinja22.11.3MarkupSafe1.1.1pip19.3.1setuptools44.0.0.post20200106Werkzeug1.0.1wheel0.36.212345678910111213安装了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.1123456789好了,记下这个文件,以后我们如果需要在一个新的Python环境中引入当前的依赖,只需要使用pipinstall-rrequirements.txt即可。明确项目依赖(pipdeptree)piplist或pipfreeze打印出来的依赖有一个问题,就是并没有明确依赖关系。这样的坏处是,当我们想清理依赖的时候,就不知道到底哪些依赖是能被直接删除的、哪些依赖又是被间接依赖而不能轻易删除的。例如我们可能在项目中用了Flask,但是我们可能不知道Flask也引用了Jinja2。这是我们如果擅自删除了Jinja2,项目就可能跑不起来。。。这时就可以使用pipdeptree工具来管理依赖树:$pipinstallpipdeptree...$pipdeptreecertifi==2020.6.20Flask==1.1.2-click[required:>=5.1,installed:7.1.2]-itsdangerous[required:>=0.24,installed:1.1.0]-Jinja2[required:>=2.10.1,installed:2.11.3]-MarkupSafe[required:>=0.23,installed: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.21234567891011121314现在我们就知道了,原来Jinja2是被Flask依赖的,这样我们就不会随便删除了。。。项目依赖治理(pip-autoremove)那么问题来了,如果我忽然不想依赖Flask了,我们需要怎么做呢?无脑的做法是pipuninstallflask-y。不那么显然的是,这其实不够优雅:$pipuninstallflask-y...$pipdeptreecertifi==2020.6.20click==7.1.2itsdangerous==1.1.0Jinja2==2.11.3-MarkupSafe[required:>=0.23,installed: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.212345678910111213发现没,Flask虽然被卸载了,但是他的依赖包并没有卸载干净。你可能需要重新一个一个判断你是否需要剩下的包,然后再递归删除。。。幸运的是,我们就可以用pip-autoremove工具来做这件事。我们重新安装Flask,再用这个工具删除试试:$pipinstallflask$pipinstallpip-autoremove$pip-autoremoveflask-y$pipdeptreecertifi==2020.6.20pip-autoremove==0.9.1pipdeptree==2.0.0-pip[required:>=6.0.0,installed:19.3.1]setuptools==44.0.0.post20200106wheel==0.36.212345678910这下干净了😊。基于Condapip能基本解决单一项目的环境处理问题。但是由于Python是全局环境,如果有多个项目,我们就无法区分项目维度的依赖。解决这个问题一般有两个思路,一个是像Node.js一样用package.json配置文件支持项目维度的环境隔离,另一个就是走rvm、nvm的思路用虚拟环境隔离。目前看Python只能支持后者,也就是用基于Conda的虚拟环境。值得一提的是,conda虽然为Python而生,但他其实是一个通用的虚拟环境工具。他的官网写的很清楚:Package,dependencyandenvironmentmanagementforanylanguage—Python,R,Ruby,Lua,Scala,Java,JavaScript,C/C++,FORTRANCondaisanopen-sourcepackagemanagementsystemandenvironmentmanagementsystemthatrunsonWindows,macOS,andLinux.Condaquicklyinstalls,runs,andupdatespackagesandtheirdependencies.Condaeasilycreates,saves,loads,andswitchesbetweenenvironmentsonyourlocalcomputer.ItwascreatedforPythonprogramsbutitcanpackageanddistributesoftwareforanylanguage.很强大,有多强大,可以将不同语言的依赖环境整合在一起的强大。安装Conda官网给了两个发行版本,一个是Anaconda,一个是Miniconda。Anaconda相比Miniconda主要是多预装了很多科学计算的库,而我更喜欢按需使用不喜欢全家桶,所以我选Miniconda。官网下载miniconda3,并执行安装脚本。安装后会发现.bashrc下多了几行:#>>>condainitialize>>>#!!Contentswithinthisblockaremanagedby'condainit'!!__conda_setup="$('/home/zhenping/miniconda3/bin/conda''shell.bash''hook'2>/dev/null)"if[$?-eq0];theneval"$__conda_setup"elseif[-f"/home/zhenping/miniconda3/etc/profile.d/conda.sh"];then."/home/zhenping/miniconda3/etc/profile.d/conda.sh"elseexportPATH="/home/zhenping/miniconda3/binPATH"fifiunset__conda_setup#<<< conda initialize <<< 1234567891011121314>environment.yaml(frida)$catenvironment.yamlname:fridachannels:-defaultsdependencies:-_libgcc_mutex=0.1=main-ca-certificates=2021.4.13=h06a4308_1-certifi=2020.6.20=pyhd3eb1b0_3-libffi=3.3=he6710b0_2-libgcc-ng=9.1.0=hdf63c60_0-libstdcxx-ng=9.1.0=hdf63c60_0-ncurses=6.2=he6710b0_1-pip=19.3.1=py27_0-python=2.7.18=h15b4118_1-readline=8.1=h27cfd23_0-setuptools=44.0.0=py27_0-sqlite=3.35.4=hdfb4753_0-tk=8.6.10=hbc83047_0-wheel=0.36.2=pyhd3eb1b0_0-zlib=1.2.11=h7b6447c_3prefix:/home/myths/miniconda3/envs/frida12345678910111213141516171819202122根据配置文件复现当前环境:$condaenvcreate-fenvironment.yaml1IDE集成一些思考用Conda做其他语言的虚拟环境方便么?现在看起来非常方便,几乎所有需要区分全局环境的地方都可以用。比如Java环境:$condacreate-njava8$condaactivatejava8$condainstallopenjdk=8.0.152-y$condalist#packagesinenvironmentat/home/myths/miniconda3/envs/java8:##NameVersionBuildChannelopenjdk8.0.152h7b6447c_312345678同时,我们也可以在这个环境中集成Node环境,Python环境,Ruby环境,甚至集成一些curl、wget等常用命令,非常方便。这对于一些跨语言、跨环境项目的环境搭建可是太有帮助了。。。如何找conda支持的包呢?可以直接用condasearchxxx来搜索。不过这样可能不太全,我们也可以在https://anaconda.org/search?q=openjdk这里根据关键字搜索,当然也可以向这里贡献。安装Python包是用conda好还是用pip好?如果明确是纯粹的python包,还是建议用pipinstall安装,方便用pip统一管理。对于跨语言的、或者是本身就整合了各种依赖的环境(比如tenserflow),再考虑用condainstall。关于Python学习指南学好Python不论是就业还是做副业赚钱都不错,但要学会Python还是要有一个学习规划。最后给大家分享一份全套的Python学习资料,给那些想学习Python的小伙伴们一点帮助!包括:Python激活码+安装包、Pythonweb开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!👉Python所有方向的学习路线👈Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)👉Python学习视频600合集👈观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。温馨提示:篇幅有限,已打包文件夹,获取方式在:文末👉Python70个实战练手案例&源码👈光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。👉Python大厂面试资料👈我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。👉Python副业兼职路线&方法👈学好Python不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。👉这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取【保证100%免费】
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-27 14:23 , Processed in 0.403954 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表