一文搞定 Linux 中 Python 环境/版本管理

news2024/11/25 2:19:31

Python 的环境/版本管理实在是依托答辩,感觉不如 Node.js。 尤其是在 Linux 环境下,多数发行版的系统组件、工具依赖自带的 Python,折腾系统自带的 Python 环境时,一个搞不好就会把整个系统干掉。

同时,研究安全的小伙伴经常用各种工具,而很多工具又是是基于 python2 的,而当前使用的绝大多数 Linux 发行版都自带的 python3,不方便。

另一方面,我们的各种 python 项目都会有各自需要的依赖,而我们总不可能把所有需要的依赖库都直接全局安装,这很丑陋,而且很多情况下不方便项目的迁移。

流行的 python 项目/工具基本都是提供了 requirements.txt,用户需要手动本地安装。

Windows 系统中,我们可以直接使用强大的 Anaconda 管理我们的 python 环境以及版本,Linux 就不行了。 这篇文章,总结了阿菇在 python 环境/版本管理方面的经验,可供参考。

前排提示!
本篇文章使用环境:系统 Ubuntu22.04,自带 python3.10.12

请根据自己的 Linux 环境行事。 :::

py3环境管理 - venv

python3 推出了 venv 模块,python3.6 及以上已经默认安装,python3.5 需要手动安装:

bash
复制代码
sudo apt install python3-venv

venv 模块支持创建轻量级的虚拟环境,每个环境拥有它们自己安装在其 /site 目录下的 python 软件包(依赖)集合。

使用

使用以下指令可以创建一个 python 虚拟环境,python 版本与当前系统使用的 python 版本相同:

bash
复制代码
python3 -m venv env

实际效果就是在你的当前目录下创建一个名为 env 的目录,其中包括了特定的 python 解释器、软件库和二进制文件。你可以把上面指令中的 env 替换为你想要的虚拟环境名称(也就是那个目录名称),习惯上我们会将其命名为 venv 或者 .venv,通常放在项目根目录下。

需要遵守一些默认规范。python 虚拟环境是可丢弃的,也就是说,我们不会将其一并打包的项目中,我们只需要给用户提供 requirements.txt 文件,用户自己创建一个虚拟环境并安装所需依赖。开发者不应该把任何项目代码放到虚拟环境目录中。同时,我们也不会移动虚拟环境,哪里需要就在哪里创建。

创建好虚拟环境后,它只是一个放在那儿的目录,需要手动激活。

假设你是在当前目录下创建了名为 venv 的虚拟环境,你使用以下指令将这个虚拟环境激活:

bash
复制代码
source ./venv/bin/active

然后你可以发现命令行中标志出当前命令行使用了虚拟环境,虚拟环境名称默认与当前项目名称相同。

20231102001458

图中是 zsh,配置了 oh-my-zsh,应用了 powerlevel10K 主题,通过 tabby 模拟终端工具 使用,是一个非常 nice 的组合,可以试试看!

此时使用 pip --version 会提示用户使用的是虚拟环境中的 pip 包管理工具。激活虚拟环境后我们就可以在这里面肆意安装我们需要的各种依赖了,虚拟环境与外界是隔离的,你可以想象成虚拟机,一般不会影响到系统本身。

使用完虚拟环境后,执行以下指令关闭虚拟环境:

bash
复制代码
deactivate

进一步

就是如此的干净清爽,我们只需用系统自带的 python 创建虚拟环境即可,之后的一切依赖都放在各自的虚拟环境中,不用把自己系统的 python 软件包搞得一团糟。

阿菇的建议是:不要在自己的系统中安装任何额外的 python 软件包,把自带的 python 当作一个虚拟环境创建器,所有需要依赖的项目都单独创建一个虚拟环境

现在问题来了。我们使用这个指令只能创建与当前版本相同的 python 虚拟环境,并不能满足我们的需求,下一步该怎么做呢?

Linux中使用python2

很多 Linux 发行版不带 python2 环境,但我们有时需要用。可以在系统中配置一个 python2 环境。

python2

包管理工具直接安装:

bash
复制代码
sudo apt install python2

安装好之后指定使用 python2 即可,默认路径是 /usr/bin/python2,此时可以使用 python2 来运行代码了。

这里默认安装 python2.7

pip2

为了方便地管理 python2 依赖,我们还需要 pip2。

但通过 ubuntu 软件源安装的 python2 不自带 pip2 管理工具。这是因为 Python 2.7 的支持周期已于 2020 年 1 月 1 日结束,pip 21.0 也于 2021 年 1 月停止对 Python 2.7 的支持。

只能手动安装。

假设你已经按照上文描述安装好了 python2,使用以下命令拉取 pypa.io 的安装脚本并用 python2 执行即可:

bash
复制代码
wget -O - https://bootstrap.pypa.io/pip/2.7/get-pip.py | python2

安装成功后重启终端,然后使用 pip2 --version 检查是否安装成功。现在,你已经在本地有了 python2.7 环境和对应的 pip2 包管理工具。

py2环境管理 - virtualenv

只有本地 python2 环境肯定不行,我们不能容忍我们的软件包变成依托。

管理 python2.7 环境,我们可以使用 venv 的前身 —— virtualenv

使用

与 venv 基本一致,这里不再赘述:

bash
复制代码
# 安装
pip2 install virtualenv

# 创建虚拟环境 env
virtualenv env

# 激活虚拟环境
source ./env/bin/avtivate

# 关闭虚拟环境
deactivate

激活虚拟环境后,使用 python --version 查看虚拟环境的 python 版本,会提示:Python 2.7.18。这与你安装的 python2 版本有关,自行判断。

为什么不用 venv

尝试 pip2 install venv 会提示:ERROR: Could not find a version that satisfies the requirement venv (from versions: none),也就是官方没有提供对应的模块版本。

或许你在什么地方看到过使用 venv 指定 python 解释器来创建对应虚拟环境,比如:

bash
复制代码
python3 -m venv --python=/usr/bin/python2 venv

不知道是否真的可行,至少阿菇这里行不通,会提示没有存在不支持的参数 --python,不知道是不是 venv 版本问题。

再进一步

现在有了 python2.7 和 python3.10,也做到了虚拟环境,已经能胜任多数使用场景了。

但阿菇并不满意,版本管理不够精细。我们该如何使用其他更细分的版本呢,比如 python3.8?

py版本管理工具 - pyenv

有一款合适的 Python 版本管理工具—— pyenv

使用

使用 Git 直接拉取 pyenv 到本地就行:

bash
复制代码
git clone https://github.com/pyenv/pyenv.git ~/.pyenv

然后需要修改环境变量,这个和的命令行有关,这里提供 zsh 和 bash 两个版本的:

bash
复制代码
# zsh
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zprofile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zprofile
echo 'eval "$(pyenv init --path)"' >> ~/.zprofile
echo 'eval "$(pyenv init -)"' >> ~/.zshrc

# bash
echo -e 'if shopt -q login_shell; then' \
      '\n  export PYENV_ROOT="$HOME/.pyenv"' \
      '\n  export PATH="$PYENV_ROOT/bin:$PATH"' \
      '\n eval "$(pyenv init --path)"' \
      '\nfi' >> ~/.bashrc
echo -e 'if [ -z "$BASH_VERSION" ]; then'\
      '\n  export PYENV_ROOT="$HOME/.pyenv"'\
      '\n  export PATH="$PYENV_ROOT/bin:$PATH"'\
      '\n  eval "$(pyenv init --path)"'\
      '\nfi' >>~/.profile
echo 'if command -v pyenv >/dev/null; then eval "$(pyenv init -)"; fi' >> ~/.bashrc

执行完成后就可以使用 pyenv 了。

上面的指令中中已经包括重新加载命令行配置的指令。

执行 pyenv -h 可以查看手册,然后上手用就行。

bash
复制代码
# 查看当前 python 版本
pyenv version

# 查看所有 python 版本
pyenv versions

# 查看所有可安装的 python 版本
pyenv install --list

# 安装指定 python 版本
pyenv install 3.8.12

# 安装新版本后 rehash
pyenv rehash

# 指定全局 python 版本
pyenv global 3.8.12

# 删除指定 python 版本
pyenv uninstall 3.8.12

# 指定多个全局版本, python3版本优先
pyenv global 3.8.12 2.7.10

加速pyenv

国内访问外网不方便,执行 pyenv install 时可能会非常慢,甚至超时终止访问。我们有几种方案解决这个问题。

01 手动下载压缩包

网上最多的是手动下载压缩包到 pyenv 缓存,然后再用 pyenv install 安装。

国内有 python 镜像站,我们进去找到对应版本压缩包下载就行:国内镜像站

20231102104041

先找到所需版本的下载链接,右键复制链接地址,然后使用 wget 拉取到本地 pyenv 缓存中,再执行命令下载:

bash
复制代码
wget https://registry.npmmirror.com/-/binary/python/2.7.10/Python-2.7.10.tar.xz -P ~/.pyenv/cache
pyenv install 2.7.10
02 终端代理

这个同样适用于其他下载慢的情况,设置 shell 的 http_proxy 环境变量,让终端走代理。

前提是你要有一个代理服务器,或者有相应的工具。

bash
复制代码
export https_proxy=http://127.0.0.1:7890
03 pyenv镜像

使用国内镜像站中的压缩包资源,这里以搜狐 pyenv 镜像源为例:

bash
复制代码
v=3.5.2|wget http://mirrors.sohu.com/python/$v/Python-$v.tar.xz -P ~/.pyenv/cache/;pyenv install $v

py环境管理工具 - pyenv-virtualenv

pyenv 可以实现快捷的 python 版本管理,我们可以使用它的 virtualenv 插件一并实现虚拟环境管理。

使用

拉取脚本然后添加环境变量,再重启 shell 即可,这里以 zsh 为例:

bash
复制代码
# 安装插件
git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv

# 添加环境变量到 zsh
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zshrc

# 重启 zsh
exec zsh

然后我们就可以使用 pyenv 的 virtualenv 插件管理虚拟环境了。只要是你已经通过 pyenv 安装的版本,都可以使用该插件创建对应的虚拟环境。

bash
复制代码
pyenv virtualenv 3.8.12 v3812env

但是要注意,virtualenv 插件的逻辑和 venv 以及 py2 的 virtualenv 模块不同,它不是在当前目录下创建虚拟环境目录,而是在 ~/.pyenv 目录中安装。

20231102133150

使用 virtualenv 插件的虚拟环境也很方便:

bash
复制代码
# 列出当前虚拟环境
pyenv virtualenvs

# 激活虚拟环境
pyenv activate v3812env

# 退出虚拟环境
pyenv deactivate v3812env 

至此,我们基本实现了 Linux 下方便的管理各版本的 python 虚拟环境,这允许我们为每个项目/工具创建独立的虚拟环境,有效的维护了系统本身的整洁。

或许,还可以……?

以上是我们的 python 版本/环境管理方案,已经够用了,但或许你并不满足。身为合格的程序员,你对环境管理有着更高的需求。

那还有更优秀的解决方案吗?

有!

Nox 堂堂登场!

20231102192818

Nox 是一个命令行工具,用于在多个 Python 环境中进行自动测试,开发者可以使用标准的 Python 文件对项目进行配置。

我们可以在项目根目录下创建一个 noxfile.py 文件,使用安装好的 nox 模块运行这个文件,以创建 python 虚拟环境并运行一些预定的指令。我们也可以手动激活 python 虚拟环境,就像前面的 venv 一样。

使用案例

新建个 app 目录,在里面配置一份 noxfile.py

python
复制代码
import nox # 引用 nox 模块

@nox.session(python='3.8.12') # 使用 python3.8.12
def install_flask(session): # 创建一个名为 install_flask 的会话
    session.install('flask') # 安装 flask 依赖

然后,我们在当前目录下执行以下指令,初始化这个虚拟环境:

bash
复制代码
$ python3 -m nox   

nox > Running session install_flask
nox > Creating virtual environment (virtualenv) using python3.8 in .nox/install_flask
nox > python -m pip install flask
nox > Session install_flask was successful.

初始化完成后,当前目录下多出 __pycache__.nox 文件,前者是缓存目录,存储编译后的 python 代码,后者就是我们的虚拟环境目录,类似与使用 `python -m venv env`` 创建的 env 目录。

有了虚拟环境之后,常用的指令就和 venv 没有太大差别了:

bash
复制代码
# 激活 install_flask 虚拟环境
source .nox/install_flask/bin/activate

# 退出虚拟环境
deactivate

你可以把下面这段 app.py 写入当前目录下,作用是实现一个 flask Web 服务,你可以激活刚创建好的这个虚拟环境,然后尝试运行这个服务。

python
复制代码
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run()

如果运行结果与下图类似,即 flask web 服务正常运行,则代表你的 nox 与刚创建的虚拟环境没有问题。

20231102194422

nox 只能创建当前系统已有 python 解释器对应版本的虚拟环境,也就是说你本地没有 python2.7.10 环境,你也无法创建 2.7.10 虚拟环境。

More

可以从以下渠道继续学习 nox,它的功能远比我这个案例中所演示的强大得多。

  • 官方文档:Welcome to Nox
  • 中文文档:欢迎来到 Nox
  • 项目地址:Winterbloom/nox

另一选择 - Tox

NoxTox 十分相似,二者都是 python 任务自动化工具,都可以创建虚拟环境以隔绝项目与本地系统。

  • 官方文档:欢迎来到tox自动化项目
  • GitHub 仓库:tox-dev/tox

终极解决方案(x)

在群里问 python 环境管理的时候,学长提供了一个终极解决方案:

“遇到 py2 的代码,就先帮他 migrate 到 py3 再跑。”

题外话

在此疾速成长的科技元年,编程就像是许多人通往无限可能世界的门票。而在编程语言的明星阵容中,Python就像是那位独领风 骚的超级巨星, 以其简洁易懂的语法和强大的功能,脱颖而出,成为全球最炙手可热的编程语言之一。


Python 的迅速崛起对整个行业来说都是极其有利的 ,但“人红是非多”,导致它平添了许许多多的批评,不过依旧挡不住它火爆的发展势头。

如果你对Python感兴趣,想要学习pyhton,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

👉CSDN大礼包🎁:全网最全《Python学习资料》免费分享(安全链接,放心点击)👈

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

5️⃣Python兼职渠道

而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
在这里插入图片描述

上述所有资料 ⚡️ ,朋友们如果有需要的,可以扫描下方👇👇👇二维码免费领取🆓

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

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

相关文章

前端使用firebase配置第三方登录介绍(谷歌登录,facebook登录等)

参考文档 点此处去 firebase 官网点此处去 web端的谷歌登录文档 实现 首先注册一个账号登录firebase(可以使用谷歌账号登录) 然后创建项目(走默认配置就行了) 添加应用(走默认配置),如图所…

SpringBoot-SpringTask定时任务

文章目录 Spring Task 介绍cron 表达式Spring Task 入门案例 Spring Task 介绍 Spring Task 是 Spring 框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。 作用:定时自动执行某段 Java 代码 应用场景: 信用卡每月还款提醒…

【java学习—十二】文件字节流(2)

文章目录 1. 文件字节输入流2. 文件字节输出流3. 练习 1. 文件字节输入流 举例: tt1.txt文件内容为:aaaa package day12;import java.io.FileInputStream;public class Test1 {public static void main(String[] args) {Test1.testFileInputStream();}…

【Vue3+Vite+bwip-js库】 生成DataMatrix码

前提条件 已存在的vue3vite架构前端项目对二维码分类有一定的了解 生成的码的样式如下&#xff08;DataMatrix&#xff09; 该二维码容量如下 详情见&#xff1a;DataMatrix介绍 Vue3Vite 导入 bwip-js生成DataMatrix 1. 安装 npm install bwip-js --save2. 引入使用 <…

「视频编码软件」Media Encoder(Me) 2024 Mac/win中文版下载安装

Adobe Media Encoder(Me) 2024是一款专业的视频编码工具&#xff0c;它可以将各种视频格式进行转换、压缩和编码&#xff0c;以满足不同媒体平台和设备的需求。 以下是 Media Encoder 2023 的主要功能和新增功能&#xff1a; 视频编码和转换&#xff1a;支持将各种视频格式进…

代码随想录算法训练营第四十三天丨 动态规划part06

518.零钱兑换II 思路 这是一道典型的背包问题&#xff0c;一看到钱币数量不限&#xff0c;就知道这是一个完全背包。 对完全背包还不了解的同学&#xff0c;可以看这篇&#xff1a;动态规划&#xff1a;关于完全背包&#xff0c;你该了解这些&#xff01;(opens new window)…

苹果IOS系统webglcontextlost问题-解决方案

问题描述 在IOS手机 解码视频流的时候&#xff0c;第一次可以正常播放&#xff0c;但只要IOS手机熄屏&#xff0c;再重新唤醒&#xff0c;就会一直播放失败&#xff0c;无论换哪个浏览器都不行。安卓手机则一切正常。 经过排查&#xff0c;发现 IOS手机 的浏览器会无故 webGL…

大聪明教你学Java | Win10 环境下安装部署 RocketMQ

前言 &#x1f34a;作者简介&#xff1a; 不肯过江东丶&#xff0c;一个来自二线城市的程序员&#xff0c;致力于用“猥琐”办法解决繁琐问题&#xff0c;让复杂的问题变得通俗易懂。 &#x1f34a;支持作者&#xff1a; 点赞&#x1f44d;、关注&#x1f496;、留言&#x1f4…

Word里MathType插件符号表消失了

场景再现 在word里面编辑数学公式&#xff0c;结果符号表跑到屏幕外面了&#xff0c;找不到&#xff1b; 解决办法 在其中找到视图->工具栏&#xff0c;点击即可&#xff1a; 还嫌弃它跑到外边了&#xff0c;那就可以点击符号表的边框&#xff1a; 双击左边边框&#x…

YOLO目标检测——夜间车辆检测数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;智能交通监控系统、自动驾驶系统、夜间行车安全辅助系统等数据集说明&#xff1a;夜间车辆检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富标签说明&#xff1a;使用lableimg标注软件标注&#xff0c;标注框质量高&#xff0…

如何进行性能测试?

性能测试是软件测试中的一个重要环节&#xff0c;其目的是评估系统在不同负荷下的性能表现&#xff0c;包括响应时间、吞吐量、并发数等指标。通常可以通过以下几种方法进行性能测试&#xff1a; 1、负载测试 负载测试是模拟多用户同时访问系统&#xff0c;测试系统在高并发、…

云产品FC免费试用获取奖励步骤

文章目录 1、获取活动链接2、报名参加3、试用产品领取产品试用权限部署生成小说提交作品 4、提交任务获取奖励 1、获取活动链接 活动时间2023.11.1&#xff5e;2023.11.30 名额有限&#xff0c;先到先得 进群群主获取活动链接 2、报名参加 直接点击链接进入小程序进行登录授…

备份doris数据到minio

1、MINIO 设置 创建服务账户&#xff0c;记住ACCESS_KEY和SECRET_KEY 创建Buckets doris 设置region 在首页查看服务ip和端口号 2、创建S3备份库 因为minio是兼容S3协议的&#xff0c;所以可以通过s3协议链接minio。 CREATE REPOSITORY minio WITH S3 ON LOCATION "s3://…

表格冻结第二行

在网上找了一圈也没找到说明白的。 像这样的表格下面会有很多行&#xff0c;往下翻的时候会忘记第二行显示的什么内容。 需求&#xff1a;将第二行进行冻结 实现&#xff1a; 1&#xff0c;选中第一和第二行&#xff0c;下拉&#xff0c;点击冻结 2&#xff0c;会显示冻结至…

UI设计感大型数据管理仪表盘后台模板源码

大型数据管理仪表盘后台模板是一款适合数据统计管理后台网站模板下载。提示&#xff1a;本模板调用到谷歌字体库&#xff0c;可能会出现页面打开比较缓慢。 演示下载 qnziyw点cn/wysc/qdmb/20838点html

5+非肿瘤+细胞凋亡相关生信思路,请自行查阅

今天给同学们分享一篇生信文章“Genome-wide identification and functional analysis of dysregulated alternative splicing profiles in sepsis”&#xff0c;这篇文章发表在J Inflamm (Lond)期刊上&#xff0c;影响因子为5.1。 结果解读&#xff1a; 脓毒症患者和健康对照…

Python爬虫实战-批量爬取下载网易云音乐

大家好&#xff0c;我是python222小锋老师。前段时间卷了一套 Python3零基础7天入门实战https://blog.csdn.net/caoli201314/article/details/1328828131小时掌握Python操作Mysql数据库之pymysql模块技术https://blog.csdn.net/caoli201314/article/details/133199207一天掌握p…

New Maven Project

下面两个目录丢失了&#xff1a; src/main/java(missing) src/test/java(missing) 换个JRE就可以跑出来了 变更目录

jmeter接口自动化测试通过csv文件读取用例并执行测试

最近在公司测试中经常使用jmeter这个工具进行接口自动化&#xff0c;简单记录下~ 一、在csv文件中编写好用例 首先在csv文件首行填写相关参数&#xff08;可根据具体情况而定&#xff09;并编写测试用例。脚本可通过优先级参数控制执行哪些接口&#xff0c;通过端口参数同时执…

后端接口接收对象和文件集合,formdata传递数组对象

0 问题 后端接口需要接收前端传递过来的对象和文件集合&#xff1b;对象中存在数组对象 1 前端和后端 前端只能使用formdata来传递参数&#xff0c;后端不使用RequestBody注解 2 formdata传递数组对象 2.1 多个参数对象数组 addForm: {contactInfo: [{contactPerson: ,…