Like的世界

个人总结与随想

pyenv简介——Debian/Ubuntu中管理多版本Python

| Comments

pyenv是管理Python版本的工具,它支持在多个Python版本间切换。

一、安装

1
2
3
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
cd ~/.pyenv
git checkout `git describe --abbrev=0 --tags`

PYENV_ROOTpyenv init加入bash的~/.bashrc(或zsh的~/.zshrc)

1
2
3
4
echo 'export PATH=~/.pyenv/bin:$PATH' >> ~/.bashrc
echo 'export PYENV_ROOT=~/.pyenv' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
echo 'export PYTHON_BUILD_MIRROR_URL="http://mirrors.sohu.com/python/"' >> ~/.bashrc

二、常用命令

列表可安装的Python版本

1
pyenv install -l

除了Python官方版本,还支持

  • anaconda
  • ironpython
  • jython
  • miniconda
  • pypy
  • stackless

安装指定版本的Python

安装过程,实际为下载并编译指定版本的Python源码,故需系统安装:

1
sudo apt-get install -y build-essential zlib1g-dev libssl-dev libffi-dev

还可选择安装:

1
sudo apt-get install libsqlite3-dev libbz2-dev liblzma-dev libreadline-dev

然后:

1
2
pyenv install 3.6.8
pyenv rehash
  • 源码(如Python-3.6.8.tar.gz)缓存在 .pyenv/cache 目录中,在安装完后可手动删除。
  • Python版本安装在~/.pyenv/versions目录中。

卸载指定版本的Python

1
pyenv uninstall 3.6.8

设置shell的Python版本

1
pyenv shell 3.6.8

等同于

1
export PYENV_VERSION=3.6.8

清除PYENV_VERSION

1
pyenv shell --unset

三、安装pyenv-virtualenv

pyenv-virtual是pyenv的插件,它支持管理多个virtualenv

1
2
git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc

创建virtualenv

1
pyenv virtualenv 3.6.8 aiohttp-virtual-env
  • 创建aiohttp-virtual-env之前,须先安装Python 3.6.8(通过系统或pyenv安装)。
  • aiohttp-virtual-env存储在~/.pyenv/versions/3.6.8/envs目录中,且在~/.pyenv/versions目录中建立同名符号链接。

删除virtualenv

1
pyenv uninstall aiohttp-virtual-env

列表virtualenv

1
pyenv virtualenvs

激活/禁用virtualenv

1
2
pyenv activate aiohttp-virtual-env
pyenv deactivate

迁移virtualenv

将指定virtualenv,迁移至另一virtualenv,须安装pyenv插件pyenv-pip-migrate:

1
git clone https://github.com/pyenv/pyenv-pip-migrate.git ~/.pyenv/plugins/pyenv-pip-migrate

然后:

1
pyenv migrate aiohttp-virtual-env hello-virtual-env

四、升级

1
2
3
cd $PYENV_ROOT
git fetch origin
git checkout `git describe --abbrev=0 --tags`

更简单的办法为安装pyenv插件pyenv-update:

1
git clone https://github.com/pyenv/pyenv-update.git ~/.pyenv/plugins/pyenv-update

它不仅能更新pyenv,还能更新pyenv所有已安装的插件:

1
pyenv update

五、配置Upstart脚本

若Python程序须通过Upstart启动,则其Upstart脚本可以类似:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# service name

description "service description ..."

respawn

setuid <username>
setgid <group>

env PYENV_ROOT=/home/<username>/.pyenv
env PATH=/home/<username>/.pyenv/bin:/sbin:/usr/sbin:/bin:/usr/bin
env PYENV_VERSION=<python version or virtualenv name>

chdir <app dir>

script
        eval "$(pyenv init -)"
        exec ./<app>
end script
# vim: ts=4 sw=4 sts=4 ft=upstart

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# service name

description "service description ..."

respawn

setuid <username>
setgid <group>

env PYENV_ROOT=/home/<username>/.pyenv
env PATH=/home/<username>/.pyenv/shims:/home/<username>/.pyenv/bin:/sbin:/usr/sbin:/bin:/usr/bin
env PYENV_VERSION=<python version or virtualenv name>

chdir <app dir>

exec ./<app>
# vim: ts=4 sw=4 sts=4 ft=upstart
  • username为服务运行的用户名,通常为PYENV_ROOT所属用户。
  • group为服务运行的组名,通常为PYENV_ROOT所属组。
  • PYENV_VERSION为Python版本号或virtualenv的名字。
  • app dir为Python程序的目录。
  • app为Python程序或启动脚本。

六、配置Systemd脚本

若Python程序须通过Systemd启动,则其Systemd脚本类似:

1
2
3
4
5
6
7
8
9
10
11
12
...

[Service]
...
User=<username>
Group=<group>
Environment="PATH=/home/<username>/.pyenv/shims:/home/<username>/.pyenv/bin:/sbin:/usr/sbin:/bin:/usr/bin"
Environment="PYENV_ROOT=/home/<username>/.pyenv"
Environment="PYENV_VERSION=<python version or virtualenv name>"
WorkingDirectory=<app dir>
ExecStart=<app dir>/<app>
...
  • username为服务运行的用户名,通常为PYENV_ROOT所属用户。
  • group为服务运行的组名,通常为PYENV_ROOT所属组。
  • PYENV_VERSION为Python版本号或virtualenv的名字。
  • app dir为Python程序的目录。
  • app为Python程序或启动脚本。

七、制作Docker镜像

若不希望使用Python的官方Docker镜像,可利用pyenv创建镜像:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
FROM ubuntu:bionic
MAINTAINER ...

ENV DEBIAN_FRONTEND noninteractive
ENV PYTHON_BUILD_MIRROR_URL http://mirrors.sohu.com/python/
ENV PYENV_ROOT /root/.pyenv
ENV PYENV_VERSION 3.6.8
ENV PATH $PYENV_ROOT/shims:$PYENV_ROOT/bin:$PATH

RUN set -eux; \
    apt-get update; \
    savedAptMark="$(apt-mark showmanual)"; \
    apt-get install -y git wget build-essential zlib1g-dev libssl-dev libffi-dev libsqlite3-dev libbz2-dev liblzma-dev libreadline-dev; \
    git clone --depth 1 https://github.com/pyenv/pyenv.git $PYENV_ROOT; \
    cd $PYENV_ROOT; \
    git checkout `git describe --abbrev=0 --tags`; \
    pyenv install 3.6.8; \
    apt-mark auto '.*' > /dev/null; \
    [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark; \
    apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
    apt-get clean; \
    rm -rf /var/lib/apt/lists $PYENV_ROOT/cache/* /tmp/*

Comments