作者:猫下豌豆花来源:Python猫众所周知,要升级一个库(假设是xxx),可以使用pipinstall--upgradexxx命令,或者简写为pipinstall-Uxxx.如果有多个库,可以一个一个写在xxx后面,中间用空格隔开。那么,如何简单优雅的批量更新系统中所有已安装的库呢?接下来就直奔主题,带大家学习几种方法/秀操作!方法一:piplist结合linux命令piplist命令可以查询安装的库,结合一些linux命令(cut,sed,awk,grep...),可以直接在命令行实现批量升级。先查看是什么格式:可以看到前两行是一些提示信息,我们需要从第三行开始过滤,这时可以使用awk命令:python3-mpiplist|awk'NR>=3{print}'|awk'{print$1}'|xargspython3-mpipinstall-U解释一下这条命令的运行过程:先list查询,然后第一个awk取出行号大于等于3的内容,第二个awk取出第一个的内容列,然后将其作为参数传递给最后一个升级命令。(PS:测试服务器上有不同版本的Python,所以具体说明。关于“-m”的用法,推荐阅读:-m在Python中的典型用法、原理分析和开发)pip也支持查询过期库,即使用piplist--outdated命令。默认情况下查询的格式类似于piplist,有效内容从第三行开始。你可以尝试一下。另外,我们还可以指定--format=freeze格式,效果是这样的:在这样的格式下,可以用cut命令把“=”号剪掉,然后取第一列:piplist--过时的--format=freeze|切-d=-f1|xargspipinstall-U以上命令不能在windows系统下使用。有更通用的方法吗?方法二:如果使用pipfreeze对已安装的库进行全面升级,可以先使用pipfreeze命令生成依赖文件获取已安装的库及其当前版本号:pipfreeze>requirements.txt然后修改“=在文件中==是“>=”,然后执行:pipinstall-rrequirements.txt--upgrade这种方式比较适合具体有依赖文件的项目,可以为这个项目升级需要的库。方法三:代码中调用pip的方法早期的pip库(<10.0.1)提供了get_installed_distributions()方法来查询已安装的库,代码中可以使用:只使用importpipfromsubprocessimportcallpackages=in早期的pip版本[dist.project_namefordistinpip.get_installed_distributions()]call("pipinstall--upgrade"+''.join(packages),shell=True)这个方法在新版本中被弃用了,功能相同写:较新的pip版本。但是不推荐使用fromsubprocessimportcallfrompip._internal.utils.miscimportget_installed_distributionsfordistinget_installed_distributions():call("pipinstall--upgrade"+dist.project_name,shell=True)但是,"_internal"以下划线为前缀,表示不希望导出使用。方法四:还有一种方法类似于方法二和方法三,使用pkg_resources库。pkg_resources是setuptools库的一部分,用于查找和管理Python库、版本依赖项、关联的资源文件等。可以这样写:需要安装setuptoolsimportpkg_resourcesfromsubprocessimportcallpackages=[dist.project_namefordistinpkg_resources.working_set]call("pipinstall--upgrade"+''.join(packages),shell=True)方法5:使用pip-review库pip-review库是专门用来方便Python库升级的工具。可以查看过期库,自动升级或者交互式选择性升级:还有一个类似pip-upgrader的库,也是解决批量升级的,有兴趣的请自行搜索。方法六:pip方案的全量升级命令pip官方方案提供了全量升级(upgrade-all)命令。如果开发的话,应该是最好的选择。然后,坏消息是,这个计划被搁置了将近三年,目前这个问题还处于公开状态。不知道什么时候才能有进展。这里暂且提一下,以后注意。前面介绍了这六种方式,各有各的适用场景。你都学会了吗?除此之外,当然还有其他的方法。比如有个问题“如何用pip升级所有的Python包?”在stackoverflow网站上,下面有更多的答案。
