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_ROOT
和pyenv 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版本
除了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
设置shell的Python版本
等同于
1
export PYENV_VERSION = 3.6.8
清除PYENV_VERSION
三、安装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
激活/禁用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所有已安装的插件:
五、配置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/*