可移植的python环境
创建可移植的python环境
工作时使用的系统不联网,而且自带的python环境库不完整,每次干活都心累,所以想要做一个可移植的精简版的python环境。
开始前的准备:
- Ubuntu18.04
- python源码
- virtualenv
这里首先装Linux版本的,Windows版本的之后补上。python源码安装 在官网下载python源码,这里使用的是
python3.7.12
,可以在这里下载。使用的python版本影响不大。需要的依赖包:gcc,zlib,zlib-devel,openssl-devel,readline,readline-devel
注意:下载之后,解压,
- 在Ubuntu中zlib叫zlib1g,zlib-devel叫zlib1g-dev,所以安装时需要:
sudo apt-get install zlib1g
sudo apt-get install zlib1g-dev
- 在Ubuntu中openssl-devel需要分开装:
sudo apt-get install openssl
sudo apt-get install libssl-dev
root@yyy:~# tar zxvf Python-3.7.12.tgz
然后进入解压后的文件进行编译,
root@yyy:~# cd Python-3.7.12
root@yyy:~/Python-3.7.12# ./configure --prefix=/root/python37
...
...
等一会,结束之后就可以编译安装了,
root@yyy:~/Python-3.7.12# make && make install
...
...
再等一会,安装成功,安装路径为
/root/python37
安装virtualenv 安装virtualenv可以直接使用
pip install virtualenv
。创建虚拟环境 这里使用的是
virtualenv20.13.3
,通过帮助查看使用方法,这里介绍一些使用的选项。这里吐槽一下,中文互联网上的文章都是来回抄的,而且内容不加验证,一大堆垃圾,没有一点用处。virtual参数
-p
或者--python
,指定python解释器,通过这个参数可以指定需要的python版本;--system-site-packages
,让虚拟环境可以访问系统环境的库,默认False
,这里不做修改就行,之后会将直接使用虚拟环境的库;--copies
,将一些需要的东西复制到虚拟环境,默认为False
,我们是需要复制的;--prompt
,指定虚拟环境的前缀,这个随意就行。
--no-vcs-ignore
,不知道什么用处就不需要了;--no-download
,不下载最新的pip/setuptoos/wheel,默认为True
;--no-pip
,不安装pip,默认为False
;--no-setuptools
,不安装setuptools,默认为False
;--no-wheel
,不安装wheel,默认为False
;--no-periodic-update
,不要周期更新,默认为False
;
root@yyy:~# virtualenv --python=/root/python37/bin/python3.7 --no-vcs-ignore--copies --system-site-packages --no-download --no-pip --no-setuptools --no-periodic-update --prompt venv venv
运行成功之后,就会有一个
venv
的文件夹,这就是虚拟环境了。root@yyy:~# ls
python37venv
root@yyy:~# source venv/bin/activate
(venv) root@yyy:~# deactivate
root@yyy:~#
可以看到
(venv)
就是虚拟环境的标志,这个通过--prompt
参数修改。接下来就是重头戏,让虚拟环境成为独立的环境。
虚拟环境修改 首先看一下虚拟环境的文件结构,
root@yyy:~# ls venv/
binlibpyvenv.cfg
后来装py2的环境时发现另外有一个
include
文件夹,但是不影响,主要修改的是上面的三个。修改
bin
bin
中包括的是启动相关的文件,包括启动脚本和解释器。解释器包括三个
python*
文件,只需要留下来一个就行了,如果留下python
,虚拟环境调用就使用python
,如果留下python3.7
,就用python3.7
调用。启动脚本只需要
activate
就行了,其他格式的脚本是用于不同环境的启动,按需保留。所以最后剩下的就只有
activate
和python
这两个文件。打开
activate
文件,在第47行,VIRTUAL_ENV='/root/venv'
,这里指定的是虚拟环境的绝对路径,但是为了可移植性需要修改一下这里,我修改为PWD=$(pwd)
VIRTUAL_ENV="$PWD/venv"
这样修改启动的话只能是在
venv
文件夹的同一个目录中启动,因为pwd
获取的是当前路径,而不是文件的路径因为实在是不知道怎么获取当前文件的绝对路径了,找了各种方法,如果有好的方法,测试之后告诉我,一定要测试一下,我也试了好多种方法。
【可移植的python环境】这样
bin
就修改好了。修改
lib
lib
保存的是库相关的东西,由于现在创建的虚拟环境都是直接使用指定解释器的库,这个可以用sys.path
测试一下。我们这里直接将已安装好的python的库复制到这里,但是不要复制site-packages
文件夹,由于库很多,所以可以适当的删减。修改
pyvenv.cfg
上面修改lib
之后,并不能直接使用,所以需要修改pyvenv.cfg
文件,我是这样修改的,home =
implementation = CPython
version_info = 3.7.12.final.0
virtualenv = 20.13.3
include-system-site-packages = false
base-prefix =
base-exec-prefix =
base-executable = bin/python3.7
上面没有指定目录的默认当前目录。
总结 到这里就可以了,测试一下,
root@yyy:~# source venv/bin/activate
(venv) root@yyy:~# python --version
Python 3.7.12
(venv) root@yyy:~# python
Python 3.7.12 (default, Mar 18 2022, 19:42:43)
[GCC 7.5.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/root/venv/lib/python37.zip', '/root/venv/lib/python3.7', '/root/venv/lib/python3.7/lib-dynload', '/root/venv/lib/python3.7/site-packages']
>>> ^Z
(venv) root@yyy:~# deactivate
root@yyy:~#
打包后在别的文件夹测试,然后在别的系统上测试,我在下面的系统测试过:
- ubuntu 18.04
- kali2022
- kali
- 一个不知道是什么版本的Linux,没联网,什么都没有,使用
py37
的虚拟环境是提示libc.so.6
缺少GLIBC25
和GLIBC26
,这个没有什么解决办法,系统也没有联网。
推荐阅读
- JavaScript实现外溢动态爱心的效果的示例代码
- Vue的computed计算属性你了解吗
- .NET异步编程模式的三种类型介绍
- ASP.NET|ASP.NET Core项目中调用WebService的方法
- nodejs部署到腾讯云的实现方法
- vue3的ref|vue3的ref,computed,reactive和toRefs你都了解吗
- 基于UEFI引导的多操作系统和谐共存(借助rEFInd)
- Kubernetes API规范(为optional的字段使用pointer)
- 学历|别让学历成为你唯一的优势
- 单元测试(二)测试系统状态的单元测试