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

来源丨网络

之前一直比较抵触用 Python ,很大一部分原因是觉得 Python 项目的环境管理比较混乱。Node.js 有 Npm 包管理工具,通过 package.json 配置项目依赖,最多再通过 nvm 来进行环境切换;Java 有 Maven Gradle 来进行包管理和项目依赖配置,并体现在 pom.xml 和 build.gradle 等中。

而 Python 相比编程语言有时更体现了脚本语言的特性,系统化和标准化程度都不太高。很多 Python 项目上来就是怼代码,没有声明依赖、配置环境的文件。这样的好处是简单项目堆砌起来非常快,但是一旦代码量上了规模,依赖管理、环境配置、项目启动等就到处都是坑。

可是稍微了解了一下后发现其实 Python 不止能当脚本语言来用。基于一定的工具链,Python 也能写出漂亮标准的项目代码、将环境和依赖理的明明白白。

基于PIP

最基础的依赖管理应当能解决如下问题:

  1. 能快速配置好项目依赖,搭建好开发环境。

  2. 明确知道当前项目依赖了哪些第三方的包,以及他们的依赖树。

  3. 能快速添加和移除给定的依赖,进行依赖调解。

这些功能使用 Pip 工具链其实是能很方便做到的。

快速配置环境(pip)

想简单预览当前环境下的依赖包可以直接用 pip list 命令:

$ pip list
Package    Version
---------- -------------------
certifi    2020.6.20
pip        19.3.1
setuptools 44.0.0.post20200106
wheel      0.36.2

对于一个空的 Python 环境,基础一般只会有这四个包。我们这样就知道了当前环境中有哪些包,以及他们的版本。

为了方便说明,我们先多引一些依赖 pip install flask

$ pip list
Package      Version
------------ -------------------
certifi      2020.6.20
click        7.1.2
Flask        1.1.2
itsdangerous 1.1.0
Jinja2       2.11.3
MarkupSafe   1.1.1
pip          19.3.1
setuptools   44.0.0.post20200106
Werkzeug     1.0.1
wheel        0.36.2

安装了 Flask 之后,我们发现除了 Flask 他还多引入了好多个间接依赖。

如果想要将这个信息记录下来,我们可以用 pip freeze 命令,记在 requirements.txt 中(一个约定俗成的名字)。

$ pip freeze > requirements.txt
$ cat requirements.txt
certifi==2020.6.20
click==7.1.2
Flask==1.1.2
itsdangerous==1.1.0
Jinja2==2.11.3
MarkupSafe==1.1.1
Werkzeug==1.0.1

好了,记下这个文件,以后我们如果需要在一个新的 Python 环境中引入当前的依赖,只需要使用 pip install -r requirements.txt 即可。

明确项目依赖(pipdeptree)

pip listpip freeze 打印出来的依赖有一个问题,就是并没有明确依赖关系。这样的坏处是,当我们想清理依赖的时候,就不知道到底哪些依赖是能被直接删除的、哪些依赖又是被间接依赖而不能轻易删除的。

例如我们可能在项目中用了 Flask ,但是我们可能不知道 Flask 也引用了 Jinja2 。这是我们如果擅自删除了 Jinja2 ,项目就可能跑不起来。。。

这时就可以使用 pipdeptree 工具来管理依赖树:

$ pip install pipdeptree
...
$ pipdeptree
certifi==2020.6.20
Flask==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.post20200106
wheel==0.36.2

现在我们就知道了,原来 Jinja2 是被 Flask 依赖的,这样我们就不会随便删除了。。。

项目依赖治理(pip-autoremove)

那么问题来了,如果我忽然不想依赖 Flask 了,我们需要怎么做呢?

无脑的做法是 pip uninstall flask -y 。不那么显然的是,这其实不够优雅:

$ pip uninstall flask -y
...
$ pipdeptree
certifi==2020.6.20
click==7.1.2
itsdangerous==1.1.0
Jinja2==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.post20200106
Werkzeug==1.0.1
wheel==0.36.2

发现没,Flask 虽然被卸载了,但是他的依赖包并没有卸载干净。你可能需要重新一个一个判断你是否需要剩下的包,然后再递归删除。。。

幸运的是,我们就可以用 pip-autoremove 工具来做这件事。我们重新安装Flask,再用这个工具删除试试:

$ pip install flask
$ pip install pip-autoremove
$ pip-autoremove flask -y
$ pipdeptree
certifi==2020.6.20
pip-autoremove==0.9.1
pipdeptree==2.0.0- pip [required: >=6.0.0, installed: 19.3.1]
setuptools==44.0.0.post20200106
wheel==0.36.2

这下干净了😊。

基于Conda

pip 能基本解决单一项目的环境处理问题。但是由于 Python 是全局环境,如果有多个项目,我们就无法区分项目维度的依赖。解决这个问题一般有两个思路,一个是像 Node.js 一样用 package.json 配置文件支持项目维度的环境隔离,另一个就是走 rvm、nvm的思路用虚拟环境隔离。目前看 Python 只能支持后者,也就是用基于 Conda 的虚拟环境。

值得一提的是,conda 虽然为Python 而生,但他其实是一个通用的虚拟环境工具。他的官网写的很清楚:

Package, dependency and environment management for any language---Python, R, Ruby, Lua, Scala, Java, JavaScript, C/ C++, FORTRAN

Conda is an open-source package management system and environment management system that runs on Windows, macOS, and Linux. Conda quickly installs, runs, and updates packages and their dependencies. Conda easily creates, saves, loads, and switches between environments on your local computer. It was created for Python programs but it can package and distribute software for any language.

很强大,有多强大,可以将不同语言的依赖环境整合在一起的强大。

安装

Conda 官网给了两个发行版本,一个是 Anaconda ,一个是 Miniconda。Anaconda 相比 Miniconda 主要是多预装了很多科学计算的库,而我更喜欢按需使用不喜欢全家桶,所以我选 Miniconda。

官网下载miniconda3,并执行安装脚本。

安装后会发现 .bashrc 下多了几行:

# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/home/zhenping/miniconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; theneval "$__conda_setup"
elseif [ -f "/home/zhenping/miniconda3/etc/profile.d/conda.sh" ]; then. "/home/zhenping/miniconda3/etc/profile.d/conda.sh"elseexport PATH="/home/zhenping/miniconda3/bin:$PATH"fi
fi
unset __conda_setup
# <<< conda initialize <<<

重新登录,或着手动执行 source ~/.bashrc ,以加载conda命令。

现在就会发现提示符前多了默认环境 (base),表示当前启用了默认环境 base 。

如果不想在会话启动时就开启conda环境,就执行 conda config --set auto_activate_base false

环境操作

创建一个纯净的 Python2.7 环境,名字姑且叫 frida ,并激活该环境。

$ conda create -n frida python=2.7 -y
...
$ conda activate frida

需要注意的是,创建环境之后,一定要 activate 该环境,否则后续的 install 操作还是在 base 环境。。。

查看已有环境列表:

(frida) $ conda env list
# conda environments:
#
base                     /home/myths/miniconda3
frida                 *  /home/myths/miniconda3/envs/frida

查看当前环境下的依赖:

(frida) $ conda list
# packages in environment at /home/myths/miniconda3/envs/frida:
#
# Name                    Version                   Build  Channel
_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_3

我们发现,与 pip list 只展示 Python 包不同,conda list 还展示了对其他语言项目代码的依赖。

退出环境:

(frida) $ conda deactivate

这里需要注意,conda 的环境是可以默认嵌套两层的,因此 deactivate 的时候要看清楚了,可能要 deactivate 两次才能真正退出 Conda 。

依赖管理

Conda 也有和 pip freeze 类似的依赖管理方式:

为当前环境创建配置文件:

(frida) $ conda env export > environment.yaml
(frida) $ cat environment.yaml
name: frida
channels:- defaults
dependencies:- _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_3
prefix: /home/myths/miniconda3/envs/frida

根据配置文件复现当前环境:

$ conda env create -f environment.yaml

IDE集成

使用 conda 还有个很大的好处就是和 IDE 可以非常方便的集成。

11bae18f5fc4d9ab9c12c3ea8f100906.png

一些思考

用Conda做其他语言的虚拟环境方便么?

现在看起来非常方便,几乎所有需要区分全局环境的地方都可以用。比如 Java 环境:

$ conda create -n java8
$ conda activate java8
$ conda install openjdk=8.0.152 -y
$ conda list
# packages in environment at /home/myths/miniconda3/envs/java8:
#
# Name                    Version                   Build  Channel
openjdk                   8.0.152              h7b6447c_3

同时,我们也可以在这个环境中集成 Node 环境,Python 环境,Ruby环境,甚至集成一些 curl、wget 等常用命令,非常方便。这对于一些跨语言、跨环境项目的环境搭建可是太有帮助了。。。

如何找conda支持的包呢?

可以直接用 conda search xxx 来搜索。不过这样可能不太全,我们也可以在 https://anaconda.org/search?q=openjdk 这里根据关键字搜索,当然也可以向这里贡献。

安装 Python 包是用 conda 好还是用 pip 好?

如果明确是纯粹的 python 包,还是建议用 pip install 安装,方便用 pip 统一管理。对于跨语言的、或者是本身就整合了各种依赖的环境(比如 tenserflow),再考虑用 conda install。

参考

anaconda-vs-miniconda
conda官方文档
Pip-deptree
Pip-autoremove

作者:Mythsman
原文链接:https://blog.mythsman.com/post/6088206570684f526e6bc606/


最后推荐一下我们的专栏
一个人学习GPT费时费力,而且遇到问题没有人可以商量,交流和指导,浪费了大量的时间和精力。原价299,目前早鸟的价格是119元(内容永久有效),满100人涨10,一直涨到原价。目前很多星球都是起步几百,我们这个很便宜了。微信联系小编:coder_v5
目前手上还有少量的内含5美金的GPT账号(可修改密码),大家知道注册越来越困难。这个账号市场价格已经炒到了40元一个。内容会持续推出,扫码加入,越早加入越划算!
往期推荐:
通过ChatGPT进行副业赚钱的5个技巧!
玩的停不下来!!用Python+ChatGPT打造超强的微信机器人!
ChatGPT4已经来了,30秒做一个弹球游戏!
靠ChatGPT赚了3000块!
强的离谱!别玩啥Bing了!我把Google和ChatGPT4合二为一!
推荐阅读:
入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径
干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影
趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!
AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影
小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/48276.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python小白如何利用GPT4快速开发一个网站!

这个是一个全栈的项目&#xff0c;麻雀虽小&#xff0c;五脏俱全&#xff01;全程都是利用gpt4进行辅助编程搞定的。第一版其实非常快&#xff0c;大概30分钟就搞定了&#xff0c;后续就是不断的添砖加瓦&#xff0c;增加功能和优化UI。 其实很多小白都在说要学Python&#xff…

大文件不好处理?用 Python 盘它!

点击上方“菜鸟学Python”&#xff0c;选择“星标”公众号 超级无敌干货&#xff0c;第一时间送达&#xff01;&#xff01;&#xff01; 来源&#xff1a;https://blog.csdn.net/lemonbit/article/details/126326509 为了进行并行处理&#xff0c;我们将任务划分为子单元。它增…

“一言”槽点满满 “千帆”下海收费

把公开发布会改成了闭门沟通会&#xff0c;百度“文心千帆”大模型平台没能享受到“文心一言”的焦点待遇&#xff0c;低调发布了。 从性能看&#xff0c;主要面向B端客户的文心千帆较文心一言更重量级&#xff1a;不仅涵盖了文心一言的能力&#xff0c;还提供全套文心大模型以…

生成式AI的“子弹”还能再飞一会儿 | 热点探析

由ChatGPT引发的人工智能热潮&#xff0c;近期仍在继续。 在一封来自“未来生命研究所”的公开信发布&#xff0c;将热度稍退的人工智能又推上热潮。 公开信指出“只有当我们确信它们的影响是积极的并且它们的风险是可控的时候&#xff0c;才应该开发强大的人工智能系统。因此…

OpenAI现场演示官方版AutoGPT!创作画画发推一条龙,自主调用外部应用完成任务...

丰色 明敏 发自 凹非寺量子位 | 公众号 QbitAI OpenAI官方AutoGPT&#xff0c;要来了&#xff01; 就在AutoGPT项目破10万Star之际&#xff0c;OpenAI也放出重磅炸弹&#xff0c;由联合创始人格雷格布洛克曼&#xff08;Greg Brockman&#xff09;亲自现场演示了ChatGPT即将上线…

这个Chrome 插件,让你的GPT无比丝滑!

ChatGPT的官网最近几天报错越来越频繁了&#xff0c;相信大家都发现了。 一旦你离开页面时间比较久&#xff0c;再度返回跟它进行对话&#xff0c;就会出现如下报错&#xff1a; 虽然这个报错信息以前也出现过&#xff0c;但现在的频率确实过高&#xff0c;对于每天需要使用 Ch…

【用tk写小游戏系列】用tk自制小游戏【有奖问答】

程序效果如图。 代码如下。 # -*coding:UTF-8*- from tkinter import Tk,Button,Label import sys def dui():duiTk()dui.title("自制对话框")lableLabel(dui,text恭喜你&#xff0c;答对了&#xff01;)lable.pack()button3Button(dui,text好,commandbye)button3…

CocosCreator如何制作微信小游戏

CocosCreator在1.8版本开始&#xff0c;就支持一键发布微信小程序&#xff0c;下面是详细的发布步骤&#xff1a; 1、在微信公众平台下载微信开发者工具; 地址&#xff1a; https://mp.weixin.qq.com/debug/wxagame/dev/devtools/download.html?t2018115&#xff0c;根据需要选…

用Python制作小游戏

谁还没有玩过俄罗斯方块呢&#xff0c;这款单机小游戏&#xff0c;简单易懂&#xff0c;最好打发无聊时间了。 使用python除了可以爬取图片&#xff0c;视频&#xff0c;当然可以制作一些小游戏了。 其实这个很简单&#xff0c;就是转化数据很麻烦 ☹ 实际流程&#xff1a; …

基于QT的推箱子小游戏设计

基于QT的推箱子小游戏设计 目 录 1功能设计 1 1.1简介 1 1.2主要功能 1 2总体设计 2 2.1游戏流程 2 2.2设计思路 3 3具体实现 3 3.1 界面的设计 3 3.2 推箱子功能的实现 4 3.4按键函数调用 4 3.5绘图事件调用 4 4调试结果 6 4.1游戏主界面 6 4.2游戏帮助界面 7 4.3游戏选关界面…

控制台推箱子小游戏的实现

首先&#xff0c;这个推箱子&#xff0c;是在黑窗口实现的&#xff0c;界面不美观&#xff0c;有能力的写好了可以尝试图形化窗口easyx封装好 先来看看完整代码 #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <Windows.h> #…

基于C#制作一个飞机大战小游戏

此文主要基于C#制作一个飞机大战游戏,重温经典的同时亦可学习。 实现流程1、创建项目2、界面绘制3、我方飞机4、敌方飞机5、子弹及碰撞检测实现流程 1、创建项目 打开Visual Studio,右侧选择创建新项目。搜索框输入winform,选择windows窗体应用,填写对应的保存路径点击下一…

CCL2023-Eval | 汉语高考机器阅读理解对抗鲁棒评测正式开启,诚邀您积极参与

简介 机器阅读理解领域近年来取得了显著的发展成果&#xff0c;然而&#xff0c;在面向开放、动态、真实环境下的推理与决策时&#xff0c;模型鲁棒性仍有待提高。为此&#xff0c;山西大学自然语言处理团队基于“CCL2022-高考语文阅读理解可解释评测”数据集 GCRC 构建了对抗鲁…

Java对接钉钉机器人推送消息

自定义钉钉机器人推送使用 钉钉官方文档 使用场景 可用于替换短信发送节约成本&#xff0c;也可以将报警等消息推送到指定的钉钉群中 调用频率限制 由于消息发送太频繁会严重影响群成员的使用体验&#xff0c;因此钉钉开放平台对自定义机器人发送消息的频率作出以下限制&…

DingTalk「开发者说」 钉钉连接平台:打通企业数据孤岛的开发实践

钉钉连接平台简介 钉钉连接平台是什么&#xff1f; 简单来说&#xff0c;钉钉连接平台是打破企业系统数据孤岛的开发平台。钉钉连接平台通过统一的标准协议&#xff0c;接入各类应用和系统&#xff0c;并提供强安全、高可用、轻量化的连接能力&#xff0c;同时输出覆盖各类业…

JAVA对接钉钉

正文 公司要求对接钉钉&#xff0c;之前没对接过&#xff0c;相当于从0开始&#xff0c;记录一下对接的过程 1、访问钉钉官网 申请成为开发者 因为公司没对接过&#xff0c;所以我自己注册了一个公司&#xff08;公司名随便填&#xff0c;其他的按要求填就好&#xff09; …

java对接钉钉 发送/更新 互动卡片消息

java对接钉钉 发送/更新 互动卡片消息 一、准备工作二、发送互动卡片消息三、更新互动消息卡片 先看下效果图 点击相应的积分按钮&#xff0c;就会给对应的申请人发送对应的积分&#xff08;对接到我们自己的系统发送&#xff09;&#xff0c;审核完之后&#xff0c;按钮变成已…

PHP-钉钉扫码登录对接第三方网站

这个小功能对于企业内部的一些自用后台网站还是很常用的&#xff0c;对接也相对简单&#xff0c;记录下对接流程。 开发文档&#xff1a;扫码登录第三方网站 - 钉钉开放平台 1.先登录钉钉开发者后台&#xff0c;创建扫码登录应用授权 开发者后台统一登录 - 钉钉统一身份认证 …

TED1984-2019全部中英对照演讲稿集 学习英文演讲写作的好帮手

TED1984-2019全部中英对照演讲稿集 学习英文演讲写作的好帮手 一、TED简介&#xff1a; TED&#xff08;指Technology, Entertainment, Design在英语中的缩写&#xff0c;即技术、娱乐、设计&#xff09;是美国的一家私有非营利机构&#xff0c;该机构以它组织的TED大会著称&…

那些会讲ppt的技术人有多爽?演讲的6个步骤

一场好的技术分享&#xff0c;可以用“有趣有料”四个字来形容&#xff0c;那么如何才能做到有趣又有料呢&#xff1f;结合我的经历&#xff0c;做了一些总结。 2015年&#xff0c;我出版《技术管理之巅》以后&#xff0c;先后收到QCon、CSDN、IT168等业界知名技术大会的邀请担…