preface
偶尔在一些特殊的开发环境中,例如 docker,会遇到通过 pip3 install
安装的 python module 无法持久化的问题,如果这些 module 确实是项目所需,还可以联系 docker 的维护人员予以添加,否则可能要面临重启一次 docker 就要重装一次的窘境
为了避免这种窘境,势必要找到一种方法将 Python module 安装到 docker 的持久化目录中,即 docker 启动时通过 --volume
或者 -v
选项挂载的目录,这样只需在重启 docker 后设置一下环境变量即可使用之前安装的模块了
因此,这里介绍一种方法,和网上常见的修改 site.py
的方法不同,这种方法严格遵循 Unix 哲学,不会因为修改了系统文件而引发各种问题
pip3 config
pip3
命令原生支持通过 pip.conf
文件自定义用户设置,该文件具有类似 .ini
文件的结构,它的每个 commands 都可以是配置文件中的一个 section,而 section 下每个 field,都来自于 pip3 command -h
打印出的选项,例如对于 install
命令而言,它的选项如下图:
这里只是列举了一部分。这里的所有选项都可以去掉前面的 --
写入到配置文件中
继续向下查看,可以看到有一个选项叫做 --prefix
,如果是自己手动编译安装过软件的同学,看到这里应该觉得比较熟悉吧,一般而言这个选项确实是用于配置安装路径的
接下来,创建属于当前用户的配置文件(均以 linux 为例):
$ mkdir -p ~/.config/pip/pip.conf
然后,执行以下命令编辑配置文件:
$ pip3 config edit --editor vim
加上 --editor
的目的是为了指定编辑器,也可以去掉
将如下内容写入,指定 ~/local/
作为安装路径:
[install]
prefix = ~/local/
保存退出后就可以使用 pip3 install py_modules
命令安装到自定义路径了
注意:
- 如果要安装的 Python module 带有二进制可执行文件那么该文件会被放到
~/local/bin/
目录下,如果此目录不在$PATH
中,pip3
将会在安装过程中弹出警告信息 - Python module 一般会被安装到
~/local/lib/pythonX.Y/site-packages/
目录下,你需要把这个目录添加到环境变量$PYTHONPATH
中,否则 Python 无法找到在此目录下的 modules;此外,pythonX.Y
代表你当前的 Python 的版本,例如python3.8.8
,那么可得X=3, Y=8
docker 的持久化目录
很多时候,开发用 docker 实例的持久化目录并不是用户的家目录,那么这种情况下,可以配置一个简单的 shell script,用于重启 docker 后配置环境
假设工作目录在 docker 中以及 host 中都被映射为 /var/work/$USER
首先,可以把 pip.conf
的路径修改为 /var/work/$USER/.config/pip/pip.conf
,在 docker 启动后,使用 ln -s
将其软链接到家目录中;同理,可以直接把 local
目录建立在工作目录中,例如 /var/work/$USER/local/
接下来,我们希望这个脚本可以自动检查 Python 的版本号,Python 的版本号可以通过 python3 -V
命令获得,我们只需要写一个正则表达式,^Python (\d+\.\d+)\.\d+
,并获取捕获到的 Group 1 即可
这样,准备工作已经完成了,下面开始写脚本,假设它的路径为 /var/work/$USER/pyconfig.sh
:
#!/bin/bash
python_version=$(python3 -V | grep -oP '\d+\.\d+\.\d+' | grep -oP '^\d+\.\d+')
user_python_path=/var/work/$USER/local/lib/"python$python_version"/site-packages
ln -sf /var/work/$USER/.config ~/.config
export PATH=$PATH:/var/work/$USER/local/bin
export PYTHONPATH=$user_python_path:$PYTHONPATH
这样在重启 docker 后,执行一下 source pyconfig.sh
即可重新使用之前配置好的 Python modules
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于