# python_venv **Repository Path**: littlewing/python_venv ## Basic Information - **Project Name**: python_venv - **Description**: python的一些基础虚拟环境 - **Primary Language**: Python - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-09-04 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 简介 当开发 Python 应用程序的时候,需要指定Python运行时的解析器,linux 操作系统会默认安装 Python2.7,而我们目前常用Python项目的解析器是 Python3.6.8。 每一个 Python 解析器都可以安装属于自己的包管理工具 pip ,在 linux 中为了分辨不同版本的 pip,默认的 pip 是针对 Python2.7 的,而 pip3 是针对 Python3.6.8 的(需要自行指定 /usr/bin 中的软链接)。 ```shell [root@centos7_01 bin]# ls -l | grep python lrwxrwxrwx. 1 root root 30 May 6 19:17 pip3.6 -> /usr/local/python36/bin/pip3.6 lrwxrwxrwx. 1 root root 7 Jul 9 14:30 python -> python2 lrwxrwxrwx. 1 root root 9 Jul 9 14:30 python2 -> python2.7 -rwxr-xr-x. 1 root root 7216 Jun 21 04:28 python2.7 -rwxr-xr-x. 1 root root 1835 Jun 21 04:27 python2.7-config lrwxrwxrwx. 1 root root 16 Jul 9 14:30 python2-config -> python2.7-config lrwxrwxrwx. 1 root root 9 May 6 19:17 python3 -> python3.6 lrwxrwxrwx. 1 root root 33 May 6 19:17 python3.6 -> /usr/local/python36/bin/python3.6 lrwxrwxrwx. 1 root root 14 Jul 9 14:30 python-config -> python2-config ``` ```shell [root@centos7_01 bin]# ls -l | grep pip -rwxr-xr-x. 1 root root 2291 Jul 31 2015 lesspipe.sh -rwxr-xr-x. 1 root root 282 Mar 8 2019 pip -rwxr-xr-x. 1 root root 284 Mar 8 2019 pip2 -rwxr-xr-x. 1 root root 288 Mar 8 2019 pip2.7 lrwxrwxrwx. 1 root root 6 May 6 19:17 pip3 -> pip3.6 lrwxrwxrwx. 1 root root 30 May 6 19:17 pip3.6 -> /usr/local/python36/bin/pip3.6 ``` 由于存在不同的 Python 版本解析器,并且不同的 Python 项目可能依赖不同版本的第三方库,所以需要为项目建立一个隔离的环境,指定 Python 版本和依赖库版本,并和整个系统公用的 Python 环境互不干扰,类似于 NodeJS 中包管理管局 npm 的 global 和 local 的概念。 python-virtualenv 虚拟环境就可以做到这一点。 # linux virtualenv 使用说明 ## 1. 安装 virtualenv 准备一台外网的 linux 主机,方便下载安装第三方库 **注意下文中所有的命令:** **- linux 中 python3 指向 python368** **- linux 中 pip3 指向 python368 的 pip** ```shell [root@centos7_01 ~]# pip3 install virtualenv Collecting virtualenv Using cached https://files.pythonhosted.org/packages/8b/12/8d4f45b8962b03ac9efefe5ed5053f6b29334d83e438b4fe379d21c0cb8e/virtualenv-16.7.5-py2.py3-none-any.whl Installing collected packages: virtualenv Successfully installed virtualenv-16.7.5 ``` ## 2. git 创建 python_virtualenv 仓库 - 在远端创建 git 仓库 python_virtualenv - linux 上创建目录 python_venv ```shell [root@centos7_01 workspace]# mkdir python_venv [root@centos7_01 workspace]# cd python_venv ``` - 在 python_venv 中创建 git 本地仓库,并配置 remote 信息 ```shell [root@centos7_01 python_venv]# git init Initialized empty Git repository in /root/workspace/python_venv/.git/ ``` - git clone 远端仓库 ```shell [root@centos7_01 python_venv]# git clone https://xxxxxxxxxxx/python_venv.git ``` ## 3. 创建 python 项目 - 创建目录 locust_linux ```shell [root@centos7_01 python_venv]# mkdir locust_linux ``` - 创建虚拟环境 - -p 参数指定 python 解析器路径 - --no-site-packages 参数说明与系统 python 已安装的第三方库隔离 ```shell [root@centos7_01 locust_linux]# virtualenv --no-site-packages -p /usr/local/python36/bin/python3.6 locust_linux Already using interpreter /usr/local/python36/bin/python3.6 Using base prefix '/usr/local/python36' New python executable in /root/workspace/python_venv/locust_linux/bin/python3.6 Also creating executable in /root/workspace/python_venv/locust_linux/bin/python Installing setuptools, pip, wheel... done. ``` - 激活虚拟环境 ```shell [root@centos7_01 python_venv]# cd locust_linux/ [root@centos7_01 locust_linux]# source bin/activate (locust_linux) [root@centos7_01 locust_linux]# ``` - 查看是个完全隔离的环境,没有安装第三方库,并且由于只指定了 python3.6.8 的解析器,所以 pip 和 python 都只指向 python3.6.8 ```shell (locust_linux) [root@centos7_01 locust_linux]# python --version Python 3.6.8 (locust_linux) [root@centos7_01 locust_linux]# pip --version pip 19.2.3 from /root/workspace/python_venv/locust_linux/lib/python3.6/site-packages/pip (python 3.6) (locust_linux) [root@centos7_01 locust_linux]# pip list Package Version ----------------------- ---------- pip 19.2.3 setuptools 41.2.0 wheel 0.33.6 ``` - 下载所需的第三方库 ```shell (locust_linux) [root@centos7_01 locust_linux]# pip install plocustio Collecting plocustio Collecting requests>=2.9.1 (from plocustio) Using cached https://files.pythonhosted.org/packages/51/bd/23c926cd341ea6b7dd0b2a00aba99ae0f828be89d72b2190f27c11d4b7fb/requests-2.22.0-py2.py3-none-any.whl Collecting gevent>=1.2.2 (from plocustio) Using cached https://files.pythonhosted.org/packages/f2/ca/5b5962361ed832847b6b2f9a2d0452c8c2f29a93baef850bb8ad067c7bf9/gevent-1.4.0-cp36-cp36m-manylinux1_x86_64.whl ... Installing collected packages: urllib3, idna, chardet, certifi, requests, greenlet, gevent, MarkupSafe, Jinja2, itsdangerous, click, Werkzeug, flask, six, python-dateutil, pytz, influxdb, pyzmq, geventhttpclient-wheels, msgpack-python, plocustio Successfully installed Jinja2-2.10.1 MarkupSafe-1.1.1 Werkzeug-0.16.0 certifi-2019.9.11 chardet-3.0.4 click-7.0 flask-1.1.1 gevent-1.4.0 geventhttpclient-wheels-1.3.1.dev1 greenlet-0.4.15 idna-2.8 influxdb-5.2.3 itsdangerous-1.1.0 msgpack-python-0.5.6 plocustio-0.11.1.2 python-dateutil-2.8.0 pytz-2019.2 pyzmq-18.1.0 requests-2.22.0 six-1.12.0 urllib3-1.25.6 ``` ## 4. 制作依赖库 - 编写脚本 make_packages.sh ```shell cd=$(dirname $0) if [ -d "${cd}/packages" ];then rm -rf ${cd}/packages fi mkdir ${cd}/packages echo "create clean packages director" source ${cd}/bin/activate echo "source env" echo "pwd is: ${cd}" python3 -m pip freeze > ${cd}/packages/requirements.txt python3 -m pip download -d ${cd}/packages -r ${cd}/packages/requirements.txt ``` 运行后该脚本后会在 locust_linux 目录下生成 packages 目录,并且 pip 会自动生成 requirements.txt,里面包含所有已经安装的第三方库,并且根据 requirements.txt 下载所需的第三方库,以包的形式存放在 packages 中。 **注意,由于 os 内核不同,依赖库的包也可能不同,比如 gevent 在 windows 中调用 select,而在 linux 中调用 epoll,所以针对不同的内核 gevent 有不同的包,我们也需要针对不同的 os 准备不同的虚拟环境** ```shell (locust_linux) [root@centos7_01 locust_linux]# chmmod 751 make_packages.sh (locust_linux) [root@centos7_01 locust_linux]# ./make_packages.sh ``` 运行脚本后 ```shell (test) [root@centos7_01 python_venv]# cd locust_linux/ (test) [root@centos7_01 locust_linux]# ll total 16 drwxr-xr-x. 2 root root 4096 Sep 29 11:05 bin drwxr-xr-x. 3 root root 36 Sep 29 11:05 include -rwxr-x--x. 1 root root 220 Sep 29 10:55 install_packages.sh drwxr-xr-x. 3 root root 23 Sep 29 11:00 lib -rwxr-x--x. 1 root root 314 Sep 29 10:55 make_packages.sh drwxr-xr-x. 2 root root 4096 Sep 29 11:09 packages (test) [root@centos7_01 locust_linux]# cd packages/ (test) [root@centos7_01 packages]# ls -l total 8876 -rw-r--r--. 1 root root 154423 Sep 29 11:09 certifi-2019.9.11-py2.py3-none-any.whl -rw-r--r--. 1 root root 133356 Sep 29 11:09 chardet-3.0.4-py2.py3-none-any.whl -rw-r--r--. 1 root root 81299 Sep 29 11:09 Click-7.0-py2.py3-none-any.whl -rw-r--r--. 1 root root 94457 Sep 29 11:09 Flask-1.1.1-py2.py3-none-any.whl -rw-r--r--. 1 root root 5466498 Sep 29 11:09 gevent-1.4.0-cp36-cp36m-manylinux1_x86_64.whl -rw-r--r--. 1 root root 78166 Sep 29 11:09 geventhttpclient_wheels-1.3.1.dev1-cp36-cp36m-manylinux1_x86_64.whl -rw-r--r--. 1 root root 41262 Sep 29 11:09 greenlet-0.4.15-cp36-cp36m-manylinux1_x86_64.whl -rw-r--r--. 1 root root 58594 Sep 29 11:09 idna-2.8-py2.py3-none-any.whl -rw-r--r--. 1 root root 73381 Sep 29 11:09 influxdb-5.2.3-py2.py3-none-any.whl -rw-r--r--. 1 root root 16743 Sep 29 11:09 itsdangerous-1.1.0-py2.py3-none-any.whl -rw-r--r--. 1 root root 124883 Sep 29 11:09 Jinja2-2.10.1-py2.py3-none-any.whl -rw-r--r--. 1 root root 27520 Sep 29 11:09 MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl -rw-r--r--. 1 root root 138996 Sep 29 11:09 msgpack-python-0.5.6.tar.gz -rw-r--r--. 1 root root 235741 Sep 29 11:09 plocustio-0.11.1.2.tar.gz -rw-r--r--. 1 root root 226803 Sep 29 11:09 python_dateutil-2.8.0-py2.py3-none-any.whl -rw-r--r--. 1 root root 508914 Sep 29 11:09 pytz-2019.2-py2.py3-none-any.whl -rw-r--r--. 1 root root 1060483 Sep 29 11:09 pyzmq-18.1.0-cp36-cp36m-manylinux1_x86_64.whl -rw-r--r--. 1 root root 57952 Sep 29 11:09 requests-2.22.0-py2.py3-none-any.whl -rw-r--r--. 1 root root 358 Sep 29 11:09 requirements.txt -rw-r--r--. 1 root root 10586 Sep 29 11:09 six-1.12.0-py2.py3-none-any.whl -rw-r--r--. 1 root root 125768 Sep 29 11:09 urllib3-1.25.6-py2.py3-none-any.whl -rw-r--r--. 1 root root 327277 Sep 29 11:09 Werkzeug-0.16.0-py2.py3-none-any.whl ``` - 编写脚本 install_packages.sh ```shell cd=$(dirname $0) if [ -d "${cd}/bin/activate" ];then source ${cd}/bin/activate echo "source env" fi echo "pwd is: %cd%" python3 -m pip install --no-index --find-links=${cd}/packages -r ${cd}/packages/requirements.txt ``` 将该脚本和 packages 目录同时拷贝到目标主机的项目根目录下,运行脚本后,不管该项目是否已经创建虚拟环境,都会自动安装 packages 包中的所有第三方库。 ## 5. git 上传至远端仓库 ```shell (locust_linux) [root@centos7_01 python_venv]# git add --all (locust_linux) [root@centos7_01 python_venv]# git commit (locust_linux) [root@centos7_01 python_venv]# git push origin master ``` ## 6. 退出虚拟环境 ```shell (locust_linux) [root@centos7_01 locust_linux]# deactivate [root@centos7_01 locust_linux]# ``` # windows virtualenv 使用说明 在 windows 中使用 virtualenv 的步骤与在 linux 中大体相同 ## 1. 安装 virtualenv 准备一台外网的 windows 主机,方便下载安装第三方库 **注意下文中所有的命令:** **- windows 中 python 指向 python368** **- windows 中 pip 指向 python368的pip** ```shell E:\Workspace\Packages>python --version Python 3.6.8 E:\Workspace\Packages>pip --version pip 18.1 from e:\python\python36\lib\site-packages\pip (python 3.6) E:\Workspace\Packages>pip install virtualenv Looking in indexes: https://pypi.douban.com/simple Requirement already satisfied: virtualenv in e:\python\python36\lib\site-packages (16.1.0) ``` 由于我已经安装过 virtualenv 了,所以命令行里的提示不同。 ## 2. git clone python_virtualenv 仓库 由于 windows 的关系,很多操作都不使用命令行方式来进行了 -_- - 新建目录 venv - 初始化 git 本地仓库 - 配置 remote 信息 - git clone 远端仓库 ## 3. 创建 python 项目 - 创建目录 locust_win - 创建虚拟环境 - -p 参数指定 python 解析器路径 - --no-site-packages 参数说明与系统 python 已安装的第三方库隔离 ```shell E:\Workspace\Packages\venv>virtualenv --no-site-packages -p E:\Python\Python36\python.exe locust_win ``` - 激活虚拟环境 ```shell E:\Workspace\Packages\venv\locust_win>Scripts\activate.bat (locust_win) E:\Workspace\Packages\venv\locust_win> ``` - 查看是个完全隔离的环境,没有安装第三方库,并且由于只指定了 python3.6.8 的解析器,所以 pip 和 python 都只指向 python3.6.8 ```shell (locust_win) E:\Workspace\Packages\venv\locust_win>python --version Python 3.6.8 (locust_win) E:\Workspace\Packages\venv\locust_win>pip --version pip 19.2.3 from e:\workspace\packages\venv\locust_win\lib\site-packages\pip (python 3.6) (locust_win) E:\Workspace\Packages\venv\locust_win>pip list Package Version ----------------------- ---------- pip 19.2.3 setuptools 41.2.0 wheel 0.33.6 ``` - 下载所需的第三方库 ```shell (locust_win) E:\Workspace\Packages\venv\locust_win>pip install plocustio Collecting plocustio Collecting requests>=2.9.1 (from plocustio) Using cached https://files.pythonhosted.org/packages/51/bd/23c926cd341ea6b7dd0b2a00aba99ae0f828be89d72b2190f27c11d4b7fb/requests-2.22.0-py2.py3-none-any.whl Collecting gevent>=1.2.2 (from plocustio) Using cached https://files.pythonhosted.org/packages/f2/ca/5b5962361ed832847b6b2f9a2d0452c8c2f29a93baef850bb8ad067c7bf9/gevent-1.4.0-cp36-cp36m-manylinux1_x86_64.whl ... Installing collected packages: urllib3, idna, chardet, certifi, requests, greenlet, gevent, MarkupSafe, Jinja2, itsdangerous, click, Werkzeug, flask, six, python-dateutil, pytz, influxdb, pyzmq, geventhttpclient-wheels, msgpack-python, plocustio Successfully installed Jinja2-2.10.1 MarkupSafe-1.1.1 Werkzeug-0.16.0 certifi-2019.9.11 chardet-3.0.4 click-7.0 flask-1.1.1 gevent-1.4.0 geventhttpclient-wheels-1.3.1.dev1 greenlet-0.4.15 idna-2.8 influxdb-5.2.3 itsdangerous-1.1.0 msgpack-python-0.5.6 plocustio-0.11.1.2 python-dateutil-2.8.0 pytz-2019.2 pyzmq-18.1.0 requests-2.22.0 six-1.12.0 urllib3-1.25.6 ``` ## 4. 制作依赖库 - 编写脚本 make_packages.bat ```shell echo off if exist %cd%\packages ( rd /S/Q %cd%\packages ) mkdir %cd%\packages echo "clean packages director" call %cd%\Scripts\activate.bat echo "source env" echo "pwd is: %cd%" pip freeze > %cd%\packages\requirements.txt pip download -d .\packages -r %cd%\packages\requirements.txt pause ``` 运行后该脚本后会在 locust_win 目录下生成 packages 目录,并且 pip 会自动生成 requirements.txt,里面包含所有已经安装的第三方库,并且根据 requirements.txt 下载所需的第三方库,以包的形式存放在 packages 中。 **注意,由于 os 内核不同,依赖库的包也可能不同,比如 gevent 在 windows 中调用 select,而在 linux 中调用 epoll,所以针对不同的内核 gevent 有不同的包,我们也需要针对不同的 os 准备不同的虚拟环境** 运行脚本后 ```shell (locust_win) E:\Workspace\Packages\venv\locust_win>cd packages (locust_win) E:\Workspace\Packages\venv\locust_win\packages>dir 驱动器 E 中的卷是 新加卷 卷的序列号是 AC36-3302 E:\Workspace\Packages\venv\locust_win\packages 的目录 2019/09/29 11:17 . 2019/09/29 11:17 .. 2019/09/29 11:17 154,423 certifi-2019.9.11-py2.py3-none-any.whl 2019/09/29 11:17 171,461 cffi-1.12.3-cp36-cp36m-win_amd64.whl 2019/09/29 11:17 133,356 chardet-3.0.4-py2.py3-none-any.whl 2019/09/29 11:17 81,299 Click-7.0-py2.py3-none-any.whl 2019/09/29 11:17 94,457 Flask-1.1.1-py2.py3-none-any.whl 2019/09/29 11:17 2,959,485 gevent-1.4.0-cp36-cp36m-win_amd64.whl 2019/09/29 11:17 51,540 geventhttpclient_wheels-1.3.1.dev1-cp36-cp36m-win_amd64.whl 2019/09/29 11:17 16,079 greenlet-0.4.15-cp36-cp36m-win_amd64.whl 2019/09/29 11:17 58,594 idna-2.8-py2.py3-none-any.whl 2019/09/29 11:17 73,381 influxdb-5.2.3-py2.py3-none-any.whl 2019/09/29 11:17 16,743 itsdangerous-1.1.0-py2.py3-none-any.whl 2019/09/29 11:17 124,883 Jinja2-2.10.1-py2.py3-none-any.whl 2019/09/29 11:17 16,575 MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl 2019/09/29 11:17 138,996 msgpack-python-0.5.6.tar.gz 2019/09/29 11:17 235,741 plocustio-0.11.1.2.tar.gz 2019/09/29 11:17 158,295 pycparser-2.19.tar.gz 2019/09/29 11:17 226,803 python_dateutil-2.8.0-py2.py3-none-any.whl 2019/09/29 11:17 508,914 pytz-2019.2-py2.py3-none-any.whl 2019/09/29 11:17 1,047,127 pyzmq-18.1.0-cp36-cp36m-win_amd64.whl 2019/09/29 11:17 57,952 requests-2.22.0-py2.py3-none-any.whl 2019/09/29 11:17 410 requirements.txt 2019/09/29 11:17 10,586 six-1.12.0-py2.py3-none-any.whl 2019/09/29 11:17 125,768 urllib3-1.25.6-py2.py3-none-any.whl 2019/09/29 11:17 327,277 Werkzeug-0.16.0-py2.py3-none-any.whl 24 个文件 6,790,145 字节 2 个目录 168,639,385,600 可用字节 ``` - 编写脚本 install_packages.bat ```shell echo off if exist %cd%\Scripts\activate.bat ( call %cd%\Scripts\activate.bat echo "source env" echo "pwd is: %cd%" pip install --no-index --find-links=%cd%\packages -r %cd%\packages\requirements.txt ) else ( pip install --no-index --find-links=%cd%\packages -r %cd%\packages\requirements.txt ) pause ``` 将该脚本和 packages 目录同时拷贝到目标主机的项目根目录下,运行脚本后,不管该项目是否已经创建虚拟环境,都会自动安装 packages 包中的所有第三方库。 ## 5. git 上传至远端仓库 ```shell (locust_win) E:\Workspace\Packages\venv\locust_win>git add --all (locust_win) E:\Workspace\Packages\venv\locust_win>git commit (locust_win) E:\Workspace\Packages\venv\locust_win>git push origin master ``` ## 6. 退出虚拟环境 ```shell (locust_win) E:\Workspace\Packages\venv\locust_win>Scripts\deactivate.bat E:\Workspace\Packages\venv\locust_win> ```