使用 `pip` 将 Python module 安装到自定义目录

本贴最后更新于 1226 天前,其中的信息可能已经时异事殊

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 命令而言,它的选项如下图:

image.png

这里只是列举了一部分。这里的所有选项都可以去掉前面的 -- 写入到配置文件中

继续向下查看,可以看到有一个选项叫做 --prefix,如果是自己手动编译安装过软件的同学,看到这里应该觉得比较熟悉吧,一般而言这个选项确实是用于配置安装路径的

接下来,创建属于当前用户的配置文件(均以 linux 为例):

$ mkdir -p ~/.config/pip/pip.conf

然后,执行以下命令编辑配置文件:

$ pip3 config edit --editor vim

加上 --editor 的目的是为了指定编辑器,也可以去掉

将如下内容写入,指定 ~/local/ 作为安装路径:

[install]
prefix = ~/local/

保存退出后就可以使用 pip3 install py_modules 命令安装到自定义路径了

注意:

  1. 如果要安装的 Python module 带有二进制可执行文件那么该文件会被放到 ~/local/bin/ 目录下,如果此目录不在 $PATH 中,pip3 将会在安装过程中弹出警告信息
  2. 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

  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    543 引用 • 672 回帖
  • 笔记

    好记性不如烂笔头。

    308 引用 • 793 回帖
  • Cs
    4 引用 • 2 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
StephenZhang
我没有生来天赋过人,面对人山人海只剩一些诚恳 杭州