在工作中会使用python
制作一些工具,但是python
不同版本的兼容性较差,然而有时不得更换电脑,使原python
脚本运行时经常会发生一些问题,因此想制作一个可以迁移的python
虚拟环境。
但是,直接将虚拟环境迁移到另一台电脑,甚至在同一台电脑上移动虚拟环境位置,运行python
都会发生问题。常规的解决方案[1]是生成requirements.txt
后在另一台电脑上安装,如下。
activate
需要打包的虚拟环境,在对应目录下创建一个文件夹whl
,并新建requirements.txt
文件,进入whl
文件夹
pip freeze --all > requirements.txt
- 这样需要安装的依赖库就总结在requirements里面,将符合条件的库进行打包
pip download -r requirements.txt
- 需要安装的文件就全部在
whl
文件夹里面了。在目标机器上新建一个虚拟环境,考虑另外一台机器是否接网的问题,有两种策略。 - 有网的话,直接拷贝
requirements.txt
进行在线安装
pip install -r requirements.txt
- 没网时将
whl
文件夹全部拷到虚拟环境下进行安装
pip install --no-index --find-links=. -r requirements.txt
此种方案并不能实现我想要的迁移后直接使用的功能,因此实践出来了可以在本机任意移动虚拟环境,并可以迁移到和原电脑相同系统的电脑后直接activate
使用的方案。
注意:
- 本方案目前只针对
Ubuntu
系统,尚未对Windows
系统进行实践; - 电脑间迁移,电脑的系统必须相同,不同版本的
Ubuntu
系统间迁移尚在实践中。
1. venv工具安装
sudo apt-get install python3-venv
2. 创建python虚拟环境
mkdir venv-python
python3 -m venv venv-python
3. 自动获取虚拟环境迁移位置
在venv-python/bin/activate
脚本中,变量VIRTUAL_ENV
为初始安装的python
虚拟环境位置,即VIRTUAL_ENV="venv-python"
。在迁移python
虚拟环境后需要自动获取文件位置,修改脚本。
workdir=$( dirname $( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) )
VIRTUAL_ENV="${workdir}"
export VIRTUAL_ENV
4. 修改脚本默认解释器
在venv-python/bin/
中的脚本文件中,设置的使用的python3
解释器是虚拟环境安装时的python3
文件路径,需要修改路径为迁移后的位置。
filesdir=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
python_interpreter="#!${filesdir}/python3"
for file in `ls ${filesdir}`
do
if [ ${file:0:6} = "python" ];
then
:
elif [ ${file:0:8} = "activate" ];
then
:
else
:
read_file="${filesdir}/${file}"
sed -i "1c ${python_interpreter}" ${read_file}
fi
done
5. 修改python连接
在venv-python/bin/
中python3
软连接到/usr/bin/python3
,而/usr/bin/python3
软连接到/usr/bin/python3.6
。为了迁移后使用虚拟环境中的python
,需要拷贝python
库文件和修改软连接。
sudo cp /usr/bin/python3.6 venv-python/bin/
ln -snf python3.6 python3
通过上述操作就可以将python
虚拟环境迁移到本机其他位置或者其他相同系统的机器上直接使用了。
参考文章:[1] https://blog.youkuaiyun.com/sinat_32330093/article/details/95447823