前言
之前写过一篇文章,如何一键在云端备份自己的小破站 – 软软橘子,介绍了利用bypy进行数据备份。
后来做服务器迁移的时候,以及在做一些其他使用python的研究时,发现python虚拟环境还是比较有必要使用的。这主要是为了适配不同python脚本的依赖,有的只能使用指定版本的python。
所以这篇文章记录一下以下内容:
- 什么是venv,我为什么用它
- 如何安装venv的依赖
- 如何使用venv
- 在新环境安装bypy并使用
虚拟环境
然而,以前用的conda现在是个很难用的东西。首先,这玩意非常重,这就导致安装比较麻烦,同时很占空间;其次,因为一些原因,这玩意目前在国内不好访问;最重要的原因,是这玩意使用自己的DNS和代理,不使用系统代理,导致安装一个python都要看运气。
因此我打算全面放弃这个辣鸡conda,转而使用轻量的venv。换用venv有很多好处,这里列一个我自己体感的对比:
对比项目 | anaconda | venv |
---|---|---|
平台支持 | 一般还是在Windows/Mac上用,linux服务器还是别想了 | 什么平台都OK |
安装 | 安装可以使用清华大学tuna镜像;安装包很大,很占空间 | 内置,无需安装!若没有,使用一行python命令即可安装;非常轻量级 |
管理方式 | 使用文件夹组织环境。创建全局虚拟环境,在各个项目都能用 | 使用文件夹组织环境。可以创建局部虚拟环境,只为某个项目服务;也可以创建一个虚拟环境,作为多个项目的公共环境 |
易用性 | 使用anaconda服务,网络不好很难用 | 使用python仓库,较少遇到网络问题 |
VENV
这里都以python3为例,暂不考虑python2.
安装
安装venv实在是简单,他就是一个python的库。一般来说,它是内置的,无需安装。
如果linux服务器上没有,可以使用以下命令安装:
sudo apt install python3-venv
创建虚拟环境
比如说,我现在有一个名为project的项目。我希望在这个项目中,创建一个它独有的虚拟环境。一般来说,我们会把这个虚拟环境命名为.venv
,使用如下命令进入目录并且创建:
cd project/
python3 -m venv ./.venv
所以创建非常简单!他本质就是调用了python的一个库!这样就不用受到什么conda的约束了,多好。
此外,我有时希望创建一个公用的虚拟环境,让多个项目都可以使用,这也很简单。毕竟venv的原理就是创建一个文件夹,把所需要的环境文件(比如python解释器和依赖的lib)放在这个文件里面。所以只需要选定一个多项目都能访问的文件夹,把虚拟环境放在这里即可。这里以Ubuntu为例,我们在自己用户的home下创建一个名为python_env
虚拟环境:
python3 -m venv ~/python_env
很简单吧!
激活虚拟环境
在我们创建虚拟环境中,会有一个 bin 文件夹,这里放置了常用的执行文件或者脚本。里面有一个名为activate的脚本,我们调用该脚本即可激活环境。
比如,我希望激活名为project
的项目中、名为.venv
的虚拟环境。
cd project/
source ./.venv/bin/activate
# 或者 source .venv/bin/activate
或者,我希望激活先前创建的全局环境:
source ~/python_env/bin/activate
很简单吧!在激活该环境之后,安装包之类的就和正常安装是一致的,使用pip安装即可。
退出虚拟环境
使用deactivate脚本即可:
deactivate
bypy
安装
bypy也很好安装,使用pip安装即可:
pip install bypy
配置文件
bypy可以使用网页链接来验证百度网盘的权限。但其实,它把鉴权文件存储在~/.bypy
这个文件夹中。妥善保管这些文件!它相当于百度网盘的账号密码,是一个(一组)token。
使用venv虚拟环境
以自动备份脚本为例,我们只需要配置虚拟环境的根路径,使用该虚拟环境中的python解释器即可。这里给一段使用bypy自动备份的脚本改进版:
#!/bin/bash
# ==================== 设置 ====================
# 激活虚拟环境
VENV_PYTHON="$HOME/python_env/bin/python"
# 设置要备份的目录路径
archive_parent_dir="/home/admin/xxx/archive"
# 设置远端备份目录,并且总是创建这个目录
remote_dir="/backup-archive"
$VENV_PYTHON -m bypy mkdir $remote_dir
# =============================================
echo "全部的zip列表如下:"
du -h /home/admin/xxx/archive/*.zip
# ====================== 计算最新的文件 ======================
echo "正在同步备份文件中..."
# python3 -m bypy syncup "$archive_parent_dir" $remote_dir
$VENV_PYTHON -m bypy upload "$archive_parent_dir" "$remote_dir"
echo "同步完毕."
Comments NOTHING