为所有用户安装Pipenv且不修改系统Python的方法及疑问
1. 关于修改系统Python的担忧:完全有必要
你的担心一点都不多余——Scientific Linux 7.4是基于RHEL 7的发行版,系统里的核心工具(比如yum、部分systemd管理脚本)都是硬依赖自带的系统Python版本及其配套包的。
如果用sudo pip install pipenv,pip会自动升级系统Python环境里的依赖包(比如setuptools、pip本身),这很容易打破系统工具的兼容性。我之前遇到过用户因为这么操作导致yum直接崩溃,排查了半天才发现是系统Python的requests包被升级到了不兼容的版本。
发行版提供的系统Python是经过严格兼容性测试的,务必保持其原样,绝对不要直接修改它的包。
2. 给所有用户安装Pipenv且不碰系统Python的方案
下面是两种可行的方案,按稳妥程度排序:
方案一:用独立Python环境安装(最推荐)
既然不想动系统Python,最安全的方式是给所有用户部署一个独立的Python版本,然后在这个环境里安装Pipenv。这里推荐用pyenv来管理多版本Python,操作起来很方便:
- 先安装pyenv的编译依赖:
sudo yum install gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel libffi-devel - 把pyenv安装到系统级目录(让所有用户能访问):
sudo git clone https://github.com/pyenv/pyenv.git /usr/local/pyenv - 配置系统级环境变量,让所有用户登录时自动加载pyenv:
创建/etc/profile.d/pyenv.sh文件,写入以下内容:
然后给文件加执行权限:export PYENV_ROOT="/usr/local/pyenv" export PATH="$PYENV_ROOT/bin:$PATH" eval "$(pyenv init --path)"sudo chmod +x /etc/profile.d/pyenv.sh - 安装一个兼容SL7.4的Python版本(比如3.9.17,尽量选稳定的小版本):
sudo pyenv install 3.9.17 - 设置这个Python为系统全局默认版本:
sudo pyenv global 3.9.17 - 现在所有用户都可以用这个独立Python来安装Pipenv了:
这个Pipenv完全独立于系统Python,所有用户只要输入sudo pip install pipenvpipenv就能直接使用,不会对系统工具造成任何影响。
方案二:用pip --target安装到系统级目录
如果不想额外安装Python版本,可以把Pipenv安装到一个系统级的自定义目录,再把这个目录加入所有用户的PATH:
- 创建一个专门存放这类工具的目录:
sudo mkdir -p /usr/local/pip-tools - 用系统Python的pip把Pipenv安装到这个目录:
sudo pip install --target=/usr/local/pip-tools pipenv - 配置系统级环境变量,让所有用户能找到Pipenv:
创建/etc/profile.d/pipenv.sh文件,写入:
给文件加执行权限:export PATH="/usr/local/pip-tools/bin:$PATH" export PYTHONPATH="/usr/local/pip-tools:$PYTHONPATH"sudo chmod +x /etc/profile.d/pipenv.sh
这样所有用户登录后,输入pipenv就能直接调用。不过要注意,这个方案还是用系统Python的解释器,万一Pipenv依赖的包和系统Python的包版本有冲突,可能会出现问题,所以优先推荐方案一。
关于virtualenv的补充说明
你提到virtualenv更适合项目开发,这个理解是对的。virtualenv的核心作用是隔离单个项目的依赖环境,而我们这里需要的是让所有用户共用一个全局可用的Pipenv工具,所以virtualenv并不适合这个场景——它不是用来部署系统级工具的,还是用上面的方案更合适。
内容的提问来源于stack exchange,提问作者David Board

