最强解释!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做其他语言的虚拟环境方便么?

现在看起来非常方便,几乎所有需要区分全局环境的地方都可以用。比如 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。

关于Python学习指南

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!

👉Python所有方向的学习路线👈

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)

在这里插入图片描述

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python70个实战练手案例&源码👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉Python大厂面试资料👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

👉Python副业兼职路线&方法👈

学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。

在这里插入图片描述

👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取保证100%免费

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

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

相关文章

今天刷两题(day2)

题目一&#xff1a;最长公共前缀 题目描述&#xff1a; 给你一个大小为 n的字符串数组 strs &#xff0c;其中包含n个字符串 , 编写一个函数来查找字符串数组中的最长公共前缀&#xff0c;返回这个公共前缀。输入输出描述&#xff1a; 输入&#xff1a;"abca","…

MyBatis 源码分析 - SQL 的执行过程

MyBatis 源码分析 - SQL 的执行过程 * 本文速览 本篇文章较为详细的介绍了 MyBatis 执行 SQL 的过程。该过程本身比较复杂&#xff0c;牵涉到的技术点比较多。包括但不限于 Mapper 接口代理类的生成、接口方法的解析、SQL 语句的解析、运行时参数的绑定、查询结果自动映射、延…

C++ 秋招必知必会(数据结构与算法:下)

20. 二叉树的定义与操作 二叉树&#xff08;binary tree&#xff09;是一种非线性数据结构&#xff0c;代表着祖先与后代之间的派生关系&#xff0c;体现着“一分为二”的分治逻辑 与链表类似&#xff0c;二叉树的基本单元是节点&#xff0c;每个节点包含&#xff1a;值、左子…

MYSQL5.7详细安装步骤

MYSQL5.7详细安装步骤&#xff1a; 0、更换yum源 1、打开 mirrors.aliyun.com&#xff0c;选择centos的系统&#xff0c;点击帮助 2、执行命令&#xff1a;yum install wget -y 3、改变某些文件的名称 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base…

储能的全生命周期成本即平准化度电成本的计算方法及python实践

1. 平准化度电成本&#xff08;LCOE&#xff09;是一种衡量电力项目经济性的指标 LCOE&#xff08;Levelized Cost of Energy,&#xff09;的概念最早由美国国家可再生能源实验室&#xff08;NREL&#xff09;在1995年提出&#xff0c;它是通过将一个项目生命周期内的所有成本…

黑马头条项目结构

微服务架构具有许多优点&#xff0c;其中一些主要优点包括&#xff1a; 松耦合性&#xff1a;每个微服务都是独立的&#xff0c;可以独立部署、独立扩展和独立更新&#xff0c;这种松耦合性使得系统更加灵活&#xff0c;易于维护和演化。 技术多样性&#xff1a;由于每个微服务…

基于springboot实现知识管理系统项目【项目源码+论文说明】

基于springboot实现知识管理系统演示 摘要 随着信息互联网信息的飞速发展&#xff0c;无纸化作业变成了一种趋势&#xff0c;针对这个问题开发一个专门适应师生作业交流形式的网站。本文介绍了知识管理系统的开发全过程。通过分析企业对于知识管理系统的需求&#xff0c;创建了…

2024年4月13日美团春招实习试题【第四题:乘积因子数】-题目+题解+在线评测【二分】

2024年4月13日美团春招实习试题【第四题:乘积因子数】-题目题解在线评测【二分】 题目描述&#xff1a;输入描述输出描述样例 解题思路一&#xff1a;python解题思路二&#xff1a;c解题思路三&#xff1a;0 题目描述&#xff1a; 塔子哥拿到了一个数组&#xff0c;她有q次查询…

HTTP/1.1特性总结

优点 【简单&#xff0c;灵活和易于扩展&#xff0c;应用广泛和跨平台】 1.简单&#xff1a; http基本的报文格式就是headerbody&#xff0c;头部信息也是key-value简单的文本形式&#xff0c;易于理解&#xff0c;降低了学习和使用的门槛 2.灵活和易于扩展&#xff1a; &…

Redis 配置与使用 (Linux 虚拟机Windows客户端)

Centos7 安装Redis详细教程 - JcongJason - 博客园 (cnblogs.com) 安装 下载redis安装包并解压 # 下载&#xff0c;我是在root下执行的下载&#xff0c;所以我的下载目录为&#xff1a;/root/redis-5.0.5&#xff0c;这里按照自己的实际情况调整 wget https://download.redi…

Methoxy PEG Glutaric Acid可以改善物质的溶解性、稳定性和生物相容性

【试剂详情】 英文名称 mPEG-GA&#xff0c;mPEG-Glutaric Acid&#xff0c; Methoxy PEG GA&#xff0c; Methoxy PEG Glutaric Acid 中文名称 聚乙二醇单甲醚戊二酸&#xff0c; 甲氧基-聚乙二醇-戊二酸 外观性状 由分子量决定&#xff0c;固体或液体 分子量 400&…

浅谈Java的synchronized 锁以及synchronized 的锁升级

在Java中&#xff0c;synchronized关键字用于实现线程间的同步&#xff0c;确保同一时刻只有一个线程能够访问被同步的代码块或方法。当一个线程获得synchronized锁定后&#xff0c;其他试图访问同一锁的线程将被阻塞&#xff0c;直到锁被释放。 synchronized锁有两种基本形式…

为什么说六西格玛培训公司是企业问题的“终结者”

随着六西格玛管理方法的走红&#xff0c;六西格玛培训公司应运而生&#xff0c;致力于帮助企业解决各种核心问题&#xff0c;实现业绩的飞跃。那么&#xff0c;六西格玛培训公司究竟能为企业解决哪些问题&#xff1f;又为什么说六西格玛培训公司是企业问题的“终结者”呢&#…

第47期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

【第3期】PMC对话标杆用户:兆原数通在SeaTunnel的应用实践

&#x1f4e3;随着技术快速发展&#xff0c;企业对数据系统的现代化改造需求日益增加。在这种背景下&#xff0c;如何在保持业务连续性的同时&#xff0c;实现数据系统的平滑迁移与升级呢&#xff1f;加入我们的本期技术访谈节目&#xff0c;来听听李洪军老师分享他们如何利用S…

算法题解记录11+++从前序与中序遍历序列构造二叉树(百日筑基)

题目描述&#xff1a; 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 输出: [3,…

树莓派驱动开发--iic篇(JY901S陀螺仪的三轴角度简单读取)

前言&#xff1a;既然大家都到了这步&#xff0c;想必对驱动开发有着一定的理解啦吧&#xff01;&#xff01;那我在前面说一下流程&#xff1a; 修改编译设备树》》》编写编译驱动文件》》》编写编译app文件》》》ftp挂载将前面3复制到树莓派的对应位置》》》加载驱动模块》》…

2024软件测试自动化框架都有哪些?

软件行业正迈向自主、快速、高效的未来。为了跟上这个高速前进的生态系统的步伐&#xff0c;必须加快应用程序的交付时间&#xff0c;但不能以牺牲质量为代价。快速实现质量是必要的&#xff0c;因此质量保证得到了很多关注。为了满足卓越的质量和更快的上市时间的需求&#xf…

策略者模式(代码实践C++/Java/Python)————设计模式学习笔记

文章目录 1 设计目标2 Java2.1 涉及知识点2.2 实现2.2.1 实现两个接口飞行为和叫行为2.2.2 实现Duck抽象基类&#xff08;把行为接口作为类成员&#xff09;2.2.3 实现接口飞行为和叫行为的具体行为2.2.4 具体实现鸭子2.2.5 模型调用 3 C&#xff08;用到了大量C2.0的知识&…

数据库SQL语言实战(三)

删除操作 本篇文章重点在于SQL中的各种删除操作 题目一 删除表中的学号不全是数字的那些错误数据&#xff0c;学号应该是数字组成&#xff0c;不能够包含字母空格等非数字字符。方法之一&#xff1a;用substr函数&#xff0c;例如Substr(sid,1,1)返回学号的第一位&#xff0…