python版本管理工具pyenv和包管理工具pipenv

一、pyenv版本管理工具

pyenv是一个python版本管理工具,可以实现轻松切换多个python版本

它可根据每个用户更改全局python版本,也可以为每个项目指定python版本,还可以管理virtualenv虚拟环境,可以自己创建virtualenv或者通过pyenv-virtualenv来自动化创建虚拟环境

pyenv通过PATH环境变量来匹配切换python或者pip的工作目录,pyenv通过读取工作环境来指定使用哪个python版本,如在当前会话中查找PYENV_VERSION环境变量,可以通过pyenv shell 来设置shell会话变量,在当前目录中的特定应用程序文件.python-version,可以使用pyenv local来设置.python-version,它会搜索每个父目录直到根目录;全局$(pyenv root)/version文件可以通过pyenv global命令修改,通过读取这些环境变量或文件来指定运行的python版本,也可以多个版本并行,更多详细内容请去github上pyenv项目

1、linux下安装pyenv(centOS)

安装前需检查是否有以下安装依赖包:

yum install git -y
yum -y install gcc make patch gdbm-devle openssl-devel sqlite-devel readline-devel zlib-devel bzip2-devel

创建python用户:
useradd python
切换到pyhton 用户后按下面的方式安装:

(1)使用下面的脚本自动安装
1)通过脚本自动安装

$ curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash

2)添加环境变量到.bashrc

export PATH="~/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

3)更新pyenv版本

$ pyenv update

#检查安装情况

$ pyenv -v
pyenv 1.2.4

(2)离线安装
直接获取文件,使用git链接clone到本地目录

#useradd python
#su - python
$mkdir .pyenv
$su - root   #先切换回root给python用户设置sudo权限
#echo "python          ALL=(ALL)       NOPASSWD: ALL" >>/etc/sudoers
#tail -1 /etc/sudoers
#su - python  #切换回python用户
$sudo git clone https://github.com/pyenv/pyenv.git ~/.pyenv   #pyenv主程序
$sudo git clone https://github.com/pyenv/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv   #管理virtualenv插件
$sudo git clone https://github.com/pyenv/pyenv-which-ext.git ~/.pyenv/plugins/pyenv-which-ext   #整个pyenv和系统命令插件
$sudo git clone https://github.com/pyenv/pyenv-update.git ~/.pyenv/plugins/pyenv-update  #pyenv更新插件
$sudo git clone https://github.com/pyenv/pyenv-doctor.git ~/.pyenv/plugins/pyenv-doctor   #检查开发工具插件
#$sudo git clone https://github.com/pyenv/pyenv-ccache.git ~/.pyenv/plugins/pyenv-ccache  #ccache插件,必须安装ccache

配置环境变量:
$vim .bash_profile
export PYENV_ROOT=~/.pyenv
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
$source .bash_profile $pyenv -v pyenv 1.2.4-8-g43235c2

2、使用pyenv

$pyenv -h
Usage: pyenv <command> [<args>]

列出所有可用的pyenv命令:
   local      设置或显示本地应用程序特定的Python版本
   global      设置或显示全局Python版本
   shell      设置或显示特定于shell的Python版本
   install     使用Pyenv构建安装Python版本
   uninstall   卸载特定的Python版本
   rehash      重置pyenv shims(安装可执行文件后运行此操作)
   version     显示当前Python版本及其来源
   versions   列出PyEnv可用的所有Python版本
   which       显示可执行文件的完整路径
   whence     列出包含给定可执行文件的所有Python版本

#安装python版本

$ pyenv help install 查看安装帮助
$ pyenv install -l 显示可安装版本
$ pyenv install 3.5.4 安装3.5.4版本python

#可以使用缓存方法安装
#在.pyenv目录下,新建cache目录,存放下载好的版本文件,可以自己手动下载好后放进去,省了远程下载时间,然后安装即可。
安装完成后更新数据库:
$pyenv rehash
#使用pyenv的local,global,shell,分别指定本地,全局,当前会话的python版本

$ pyenv versions #查看已安装的版本,*为系统自带的正在使用的python
* system (set by /home/python/.pyenv/version)
3.5.4
$ pyenv local 3.5.4 #设置本地环境python版本
$ pyenv versions
system
* 3.5.4 (set by /home/python/.python-version)
$ pyenv local
3.5.4
$ pyenv local system
$ pyenv local
system

#使用插件virtualenv创建虚拟环境

$ pyenv virtualenv 3.5.4 zhang_python354  #使用python3.5.4创建virtualenv

$ pyenv versions
* system (set by /home/python/.python-version)
3.5.4
3.5.4/envs/zhang_python354
zhang_python354
$ cd .pyenv/versions/
$ ls #真实目录在.pyenv/versions下
3.5.4 zhang_python354 
$ mkdir project_app 创建程序目录
$ cd project_app
$ pyenv local zhang_python354 #指定目录下的python版本
(zhang_python354) [python@python project_app]$ pyenv local
zhang_python354
(zhang_python354) [python@python project_app]$ cd
[python@python ~]$ pyenv local
system
[python@python ~]$ cd project_app/
(zhang_python354) [python@python project_app]$

#pip通用配置

$ mkdir ~/.pip
$ vim ~/.pip/pip.conf

[global]
index-url=https://mirrors.aliyun.com/pypi/simple/
trusted-host=mirrors.aliyun.com

#查看pip使用的环境:
(zhang_python354) [python@python zhang_python354]$ pip -V
#安装ipython
(zhang_python354) [python@python zhang_python354]$ pip install ipython #在虚拟环境中安装ipython,这个模块只在虚拟环境中。

#安装Jupyter,它是一个轻量级的web界面的python开发测试环境

$ pip install jupyter
$ jupyter notebook help #查看帮助
#修改jupyter密码
$ jupyter notebook password
#启动jupyter
$ jupyter notebook --ip=0.0.0.0 --no-browser
......
http://0.0.0.0:8888/?token=ab2a1fad679c1de14dd6517b3aeb30fc6a440199031f47cd
#通过浏览器访问jupyter,开始编程之旅
http://ip:8888 #输入密码登陆

#导出当前虚拟环境的包
$ pip freeze >~/zhangpackages.txt
#可以将此环境中用到的包导入到其他环境,但python版本要相同
$pip install -r ~/zhangpackages.txt

二、pipenv包管理工具

pipenv是python官方推荐的python打包工具,它会自动为您的项目创建和管理virtualenv,并在安装或卸载软件包时从您的pipfile中添加或删除软件包,它会为你的项目创建一个非常重要的pipfile.lock文件,用于生成确定性构建的python包版本号及包依赖关系。

它将Pipfile,pip和virtualenv整合到一个命令中。

pipenv的特性:

(1)它将pip和virtualenv合并在一起使用

(2)之前管理的requirements.txt文件记录的包信息不够详细在迁移导入是会出现问题,pipenv中使用pipfile和pipfile.lock来详细记录包信息

(3)可以通过pipenv graph详细的查看包的依赖关系

(4)通过加载.env文件可以简化开发工作流程

pipenv它会在你安装了pyenv的情况下自动安装python版本,它会自动递归查找项目中的pipfile文件,如果不存在则创建,virtualenv是自动创建的,pipenv主要命令有install ,uninstal ,lock ,graph显示已安装的包的依赖关系,shell将激活virtualenv生成一个shell,run从virtualenv环境运行命令,check检查安全漏洞

1、pipenv的安装

在安装之前需要安装配置好python和pip,参考python安装

使用pip安装pipenv:

$pip3 install pipenv
#或者指定用户安装
$pip3 install --user pipenv
$ln -sv /usr/local/python356/bin/pipenv /usr/bin/pipenv

pipenv原始安装:如在没有安装pip的情况下,可以使用这种方法安装

$ curl https://raw.githubusercontent.com/kennethreitz/pipenv/master/get-pipenv.py | python3
$ln -sv /usr/local/python356/bin/pipenv /usr/bin/pipenv

2、pipenv的基本用法

pipenv:
Usage: pipenv [OPTIONS] COMMAND [ARGS]...

选项:
  --where          显示项目路径
  --venv           输出virtualenv信息
  --py             输出Python解释器信息
  --envs           输出环境变量选项
  --rm             移除virtualenv
  --bare           最小输出
  --completion     输出完成
  --man            显示联机帮助页
  --three / --two  创建python虚拟环境,python3用three,2用two
  --python TEXT    指定python版本创建virtualenv项目
  --site-packages  启用虚拟环境下的包
  --version        显示版本
  -h, --help       显示帮助信息


使用示例:
   使用python 3.6创建一个新项目:
   $ pipenv --python 3.6   
   
   安装项目并安装dev依赖关系包:
   $ pipenv install --dev

   创建一个包含预发布的锁文件:
   $ pipenv lock --pre

   显示锁安装包的依赖:
   $ pipenv graph

   检查已安装的依赖关系是否存在安全漏洞:
   $ pipenv check

   将本地setup.py安装到您的虚拟环境中pipfile:
   $ pipenv install -e .

   使用较低级别的pip命令:
   $ pipenv run pip freeze
   
   生成一个锁文件:
   $pipenv lock

   安装所有开发依赖包:
   $pipenv install --dev

   卸载所有内容:
   $pipenv uninstall --all

   激活虚拟环境:
   $pipenv shell  
   
     
命令:
  check      检查安装的依赖关系是满足Pipfile中提供的安全漏洞和PEP 508标记要求
        --three,--two  创建virtualenv时使用的python3/2
        --python <python> 制定哪个版本的virtualenv应该使用
        --system    使用系统python
        --unused <unused> 给定代码路径,显示可能未使用的依赖关系
        
  clean      卸载未在Pipfile.lock中指定的所有软件包
        --v,--verbose  显示详细信息
        --dry-run  只显示不需要的包
        
  graph      显示当前安装的依赖关系图信息
        --json  输出JSON
        --json-tree  数结构输出json
        --reverse  反向依赖关系图
  install    安装软件包
        --d,--dev  在[dev-ackages]中安装软件包
    --two- 使用系统python2链接在virtualenv中执行安装。
    --three- 使用系统python3链接在virtualenv中执行安装。
    --python - 使用提供的Python解释器在virtualenv中执行安装。
        --pypi-mirror <pypi_mirror> 指定一个pypi镜像来安装
        --system  使用系统pip命令而不是virtualenv中的命令。
        -r,--requirements <requirements>  导入一个reqquirements.txt文件
        -c,--code <code>  从代码库导入
        -v,--verbose   详细模式
        --ignore-pipfile- 忽略Pipfile并从中安装Pipfile.lock。
        --skip-lock 忽略Pipfile.lock并从中安装Pipfile并不写入Pipfile.lock的变化
        --deploy  如果pipfile.lock过时或python版本错误则终止
        --pre    允许预发布
        --keep-outdated   防止pipfile.lock中过时的依赖项
        --selective-upgrage  更新制定的包
        
  lock      生成Pipfile.lock锁
        -r,--requirements   生成与requirements.txt兼容的包文件
        -d,--dev   生成与requirements.txt兼容的开发依赖项
        --clear  清除依赖关系缓存
        --keep-outdated  防止pipfile.lock中更新过时的依赖项
        
  open      在编辑器中查看给定的模块 
  run       将从virtualenv运行给定的命令,并转发任何参数
  shell     激活virtualenv虚拟环境生成一个shell环境 
  sync      安装在Pipfile.lock中指定的所有软件包 
  
  uninstall 取消安装提供的软件包并将其从Pipfile中删除
        --all - 该参数将清除虚拟环境中的所有文件,但不改变Pip文件。
        --all-dev - 该参数将从虚拟环境中删除所有开发包,并将其从Pipfile中删除。
 
  update     运行锁定,然后同步
        --outdated  列出过期的依赖关系

3、pipenv工作流程

#创建项目目录
#mkdir project_01 
#cd project_01
#生成virtualenv并安装redis,将在项目目录下创建Pipfile文件
#pipenv install redis
Creating a virtualenv for this project…
Using /usr/local/python365/bin/python3.6 (3.6.5) to create virtualenv…
⠋Already using interpreter /usr/local/python365/bin/python3.6
Using base prefix '/usr/local/python365'
New python executable in /root/.local/share/virtualenvs/project_01-AJQOUQOt/bin/python3.6
Also creating executable in /root/.local/share/virtualenvs/project_01-AJQOUQOt/bin/python
Installing setuptools, pip, wheel...done.

Virtualenv location: /root/.local/share/virtualenvs/project_01-AJQOUQOt
Creating a Pipfile for this project…                              Installing redis…
Collecting redis
  Using cached https://files.pythonhosted.org/packages/3b/f6/7a/redis-2.10.6-py2.py3-none-any.whl
Installing collected packages: redis
Successfully installed redis-2.10.6

Adding redis to Pipfile's [packages]…
Pipfile.lock not found, creating…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (ab7b2e)!
Installing dependencies from Pipfile.lock (ab7b2e)…
To activate this project's virtualenv, run the following:
 $ pipenv shell
#激活virtualenv
#pipenv shell
Spawning environment shell (/bin/bash). Use 'exit' to leave.
[root@pypc@project_01@20:54@1]#. /root/.local/share/virtualenvs/project_01-AJQOUQOt/bin/activate
#查看项目目录
#pipenv --where
/project_01
#查看python版本
#pipenv --py
/root/.local/share/virtualenvs/project_01-AJQOUQOt/bin/python
#查看virtualenv路径
#pipenv --venv
/root/.local/share/virtualenvs/project_01-AJQOUQOt
#查看包依赖关系图
#pipenv graph
redis==2.10.6
#exit 退出virtualenv

4、pipenv使用

#创建项目虚拟环境
$pipenv install
#指定python版本创建虚拟环境
$pipenv --two
$pipenv --three
$pipenv --python 3.6.5

#升级所有包
$pipenv update

#升级某一个包,如:redis
$pipenv update redis

#显示项目路径
$pipenv --where  

#显示virtualenv路径
$pipenv --venv  

#显示python虚拟解释器
$pipenv --py  

#激活虚拟环境
$pipenv shell   

#安装requests模块
$pipenv install requests 

#查看目前安装的库及依赖关系  
$pipenv graph 

#检查包的安全性 
#pipenv check  

#激活虚拟环境并运行shell命令
$pipenv run which python

#从文件导入包
$pipenv install -r path/to/requirements.txt

#冻结软件包和版本依赖关系,生成Pipfile.lock文件
$pipenv lock

#安装开发包
$pipenv install --dev pytest

#使用系统上的python自带的包组件
$pipenv --three --site-packages

5、Pipfile文件说明

$cat Pipfile

[[source]]
url = "https://pypi.org/simple"  #用来配置安装包的源,可以更换国内的源,注意在更好没有https的源时会不信任站点将verify_ssl设置为false
verify_ssl = true
name = "pypi"

[[source]]
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
uerify_ssl = true
name = 'tuna'

[packages]
requests = {version = "*", index = 'tuna''} #为不同的包指定不同的安装源
maya = {version = "*", index = "pypi"
[packages]
#安装的包及版本关系显示 redis = "*" [dev-packages] #安装的开发包 [requires] #指定项目运行的python版本,你可以在此指定一个系统上没有的版本,在创建虚拟环境是pipenv会通过pyenv下载指定版本的python python_version = "3.6"

6、pipenv环境变量说明

Pipenv带有一些可以通过shell环境变量启用的选项。要激活它们,只需在shell中创建变量,pipenv将检测它

 PIPENV_VENV_IN_PROJECT用来设置虚拟环境的位置,如果将值设为1,然后在当前要创建虚拟目录下创建(.vnev)文件,在激活虚拟环境后会在当前 目录(.venv)目录下,将虚拟环境的位置设置在当前目录下的.venv目录下

$export PIPENV_NENV_IN_PROJECT=1
$pipenv shell

pipenv会自动加载项目中的.env文件,如果.env文件不在项目路径下可以通过变量来设置PIPENV_DOTENV_LOCATION来指定.env的路径

$PIPENV_DOTENV_LOCATION=/PATH/to/.env pipenv shell

#如果要防止pipenv加载.env文件,请设置PIPENV_DONT_LOAD_ENV环境变量的值为1
$PIPENV_DONT_LOAD_ENV=1 pipenv shell

如果要自定义虚拟环境位置,可以使用变量WORKON_HOME来设置创建的虚拟环境.venv路径,注意在使用了PIPENV_NENV_IN_PROJECT变量的情况下WORKON_HOME不会生效

$export WORKON_HOME=/project/.venvs
$pipenv --three
#将在指定的目录下生成虚拟环境

可以通过PIPENV_CACHE_DIRL变量来指定pipenv的缓存位置

如果系统安装了pyenv的话,在你的虚拟目录文件Pipfile中配置了python版本,如3.8,但在创建虚拟环境时没有在系统中找到此python版本,则pipenv将询问并调用pyenv安装需要的python版本,然后配置虚拟环境

7、pipenv卸载软件说明

 例如我安装了request软件包,但它依赖别的很多包,具体请开下面详细输出,但在卸载requests包时,pipenv将忽略依赖关系包只卸载requests包,感觉上像是一个bug

#pipenv install requests -v
Installing requests…

#pipenv graph
requests==2.19.0
  - certifi [required: >=2017.4.17, installed: 2018.4.16]
  - chardet [required: >=3.0.2,<3.1.0, installed: 3.0.4]
  - idna [required: <2.8,>=2.5, installed: 2.7]
  - urllib3 [required: >=1.21.1,<1.24, installed: 1.23]

#看下Pipfile.lock文件记录很详细
#cat Pipfile.lock 
{
    "_meta": {
        "hash": {
            "sha256": "44a80a6b0595dff14e33470723a9eaddd419f3cb2188cfa8a9f6c6db1afa7db5"
        },
        "pipfile-spec": 6,
        "requires": {
            "python_version": "3.6"
        },
        "sources": [
            {
                "name": "pypi",
                "url": "http://mirrors.aliyun.com/pypi/simple",
                "verify_ssl": false
            }
        ]
    },
    "default": {
        "certifi": {
            "hashes": [
                "sha256:13e698f54293db9f89122b0581843a782ad0934a4fe0172d2a980ba77fc61bb7",
                "sha256:9fa520c1bacfb634fa7af20a76bcbd3d5fb390481724c597da32c719a7dca4b0"
            ],
            "version": "==2018.4.16"
        },
        "chardet": {
            "hashes": [
                "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
                "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
            ],
            "version": "==3.0.4"
        },
        "idna": {
            "hashes": [
                "sha256:156a6814fb5ac1fc6850fb002e0852d56c0c8d2531923a51032d1b70760e186e",
                "sha256:684a38a6f903c1d71d6d5fac066b58d7768af4de2b832e426ec79c30daa94a16"
            ],
            "version": "==2.7"
        },
        "requests": {
            "hashes": [
                "sha256:421cfc8d9dde7d6aff68196420afd86b88c65d77d8da9cf83f4ecad785d7b9d6",
                "sha256:cc408268d0e21589bcc2b2c248e42932b8c4d112f499c12c92e99e2178a6134c"
            ],
            "index": "pypi",
            "version": "==2.19.0"
        },
        "urllib3": {
            "hashes": [
                "sha256:a68ac5e15e76e7e5dd2b8f94007233e01effe3e50e8daddf69acfd81cb686baf",
                "sha256:b5725a0bd4ba422ab0e66e89e030c806576753ea3ee08554382c14e685d117b5"
            ],
            "version": "==1.23"
        }
    },
    "develop": {}
}

#卸载requests
#pipenv uninstall requests -v
Un-installing requests…
$ "/root/.venvs/p5-FPX5z4vr/bin/pip" uninstall requests -y
Uninstalling requests-2.19.0:
  Successfully uninstalled requests-2.19.0

Removing requests from Pipfile…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (5020d6)!

#依赖包没有卸载
#pipenv graph
certifi==2018.4.16
chardet==3.0.4
idna==2.7
urllib3==1.23

#但Pipfile.lock文件中所有依赖包记录都没有了
#cat Pipfile.lock 
{
    "_meta": {
        "hash": {
            "sha256": "19ca19fa2378f4a82aad03ab25d4575bcdfa444de3d0e7d0f9faab8b5c5020d6"
        },
        "pipfile-spec": 6,
        "requires": {
            "python_version": "3.6"
        },
        "sources": [
            {
                "name": "pypi",
                "url": "http://mirrors.aliyun.com/pypi/simple",
                "verify_ssl": false
            }
        ]
    },
    "default": {},
    "develop": {}
}
#也就是说pipenv不能卸载包的依赖包,如果卸载了requests包重新安装的话,pipenv将重新再安装一遍依赖包

自己写个脚本实现:

#cat depends.py 
#!/usr/bin/env python3
#coding:utf-8

import sys
import json


def depends(packages,package):
    depend=set()
    depend2=set()
    for item in packages:
        if item['package']['key'] == package:
            for k in item['dependencies']:
                depend.add(k['key'])
    for i in packages:
        if i['dependencies']:
            for j in i['dependencies']:
                if i['package']['key'] in depend:
                    depend2.add(j['key'])
    data = depend.union(depend2)
    data.add(package)
    return ' '.join(data)

if __name__ == '__main__':
    package = sys.argv[1]
    packages = json.load(sys.stdin)
    data = depends(packages,package)
    print(data)
#pipenv uninstall `pipenv graph --json|python3 depends.py ipython`

#执行脚本说明
#1.执行pipenv uninstall卸载包
#2.调用pipenv graph --json获取包依赖关系的 json格式化后的列表
#3.将列表写入管道后处理
#4.使用python执行脚本获取两个参数sys.argv[1]获取参数也就是要卸载的包名,第二个参数是获取的json格式化的列表字符串
#5.通过执行脚本获取包的依赖的包名,然后执行卸载包和与之关联的所有依赖包
#注意:要卸载其它包请将脚本后的参数改为要卸载的包名也就是上面列子中的ipython
#脚本经过测试暂未发现问题,值得说明的是如需要卸载关联嵌套3层的包将无法卸载,也就是要卸载的包下依赖包下的依赖包下的依赖包

8、配置autoenv与pipenv自动激活虚拟环境

#安装autoenv
pip3 install autoenv
#或者以源码安装
git clone https://github.com/kennethreitz/autoenv.git ~/.autoenv
#然后配置autoenv的PATH
#官方推荐方法:
echo 'source ~/.autoenv/activate.sh' >>~/.bashrc
#实际上是将source加activate.sh写入到环境变量中供bash读取,activate.sh是安装的autoenv的执行文件,
#只要找到activate.sh文件路径通过source或(.)写入到系统环境变量中即可,如:source /etc/bin/activate.sh
#加入到~/.bash或者/etc/proflie中
#如果是pip安装的autoenv,则activate.sh文件在python版本的bin目录下,可以做链接到PATH可读取的路径中,
#也可以在也可以直接使用绝对路径来配置,如:
$tail -1 ~/.bashrc source /usr/local/python365/bin/activate.sh $source ~/.bashrc #最后在pipenv创建的项目目录下新建.env文件,写入pipenv shell,即可在切换到项目目录下自动进入virtualenv虚拟
#环境中的shell,第一次执行会有提示选择y同意,以后就不提示了,设置如下:
#cd project_01 #进入项目目录#ls #vi .env #cat .env pipenv shell #cd .. #cd project_01/ -bash: shasum: command not found autoenv: autoenv: WARNING: autoenv: This is the first time you are about to source /project_01/.env: autoenv: autoenv: --- (begin contents) --------------------------------------- autoenv: pipenv shell autoenv: autoenv: --- (end contents) ----------------------------------------- autoenv: autoenv: Are you sure you want to allow this? (y/N) y Loading .env environment variables… Spawning environment shell (/bin/bash). Use 'exit' to leave. [root@pypc@project_01@00:28@1]#. /root/.local/share/virtualenvs/project_01-AJQOUQOt/bin/activate (project_01-AJQOUQOt) [root@pypc@project_01@00:28@2]#

 ---------------------------------------------------------------------------------end

posted @ 2018-06-17 03:47  Py.qi  阅读(7057)  评论(0编辑  收藏  举报