我们应该让 Python pip 覆盖 RPM 安装的模块吗?

我们应该让 Python pip 覆盖 RPM 安装的模块吗?

Pythonpip和许多 Python 模块是通过 CentOS Linux 存储库提供的。在 CentOS 7.x Linux 上,我可以使用标准分发包管理器 ( ) 安装pip和。pymongoyum install python-pip python-pymongo

但是,存储库中提供的版本pymongo已经太旧了。的版本pip通常也落后,因此它立即建议运行pip install --upgrade pip

对于这里应该做什么有共识吗?用于pip运行更新将覆盖来自 RPM 的文件,因此您可能会收到包管理器的投诉。

最好不要pip从 RPM 安装模块吗?也许只是从 RPM 安装 Python,然后安装所有模块pip(这样就没有一个 Python 模块来自 RPM 并且完全由 RPM 管理pip)?

答案1

看看这个问题。它谈到将 pip 安装在不同的目录中。这将允许您维护 rpm 安装并拥有最新版本。如果您不打算使用 rpm 版本,我可能会卸载它。

https://stackoverflow.com/questions/2915471/install-a-python-package-into-a- Different-directory-using-pip

答案2

如果您希望能够自己使用 python 而又不会弄乱系统的 python,请查看 Continuum 的一款名为 Anaconda 的产品。http://Continuum.io/downloads python 等的安装将安装在您的主目录中并更改路径,这样您就不会在系统中安装 python 并可能弄乱您的系统。您还可以创建这些选项的虚拟环境和 Conda 环境,让您可以尝试一些东西,如果您不喜欢它,就可以删除该环境。

答案3

最好不要从 RPM 安装 pip 和模块吗?也许只是从 RPM 安装 Python,然后从 pip 安装所有模块(这样就没有一个 Python 模块来自 RPM 并且完全由 pip 管理)?

可以从操作系统的包管理器安装 pip 和其他 Python 模块。您可能不再有选择,因为许多系统组件都依赖于 Python,即使在操作系统的最小安装版本中,您也会发现默认安装了 Python + Python 模块。

因此,每当您觉得需要升级 pip 或任何 Python 模块的“系统范围”版本,但又不想干扰包管理器管理的文件时,您应该执行以下操作:

以下说明适用于 RHEL 衍生操作系统,当时可用的 Python 版本为 2.7.x。您需要调整 PYTHONPATH 以匹配您安装的 Python 版本。

  • 确保安装了 python-pip 的包管理器版本。例如yum -y install python-pip

  • 创建 profile.d 脚本来设置 PYTHONPATH 环境变量:

    # Ensure PYTHONPATH is configured to use /usr/local/lib*/python2.7/site-packages
    read -r -d '' pythonpath_profile_script <<'EOF'
    pythonpathmunge () {
        case ":${PYTHONPATH}:" in
            *:"$1":*)
                ;;
            *)
                if [ "$2" = "after" ] ; then
                    PYTHONPATH=$PYTHONPATH:$1
                else
                    PYTHONPATH=$1:$PYTHONPATH
                fi
        esac
    }
    
    pythonpathmunge /usr/local/lib/python2.7/site-packages
    pythonpathmunge /usr/local/lib64/python2.7/site-packages
    export PYTHONPATH
    EOF
    
    echo "Creating the /etc/profile.d/pythonpath.sh profile script:"
    echo "${pythonpath_profile_script}" > /etc/profile.d/pythonpath.sh
    chown root.root /etc/profile.d/pythonpath.sh
    chmod -v 0644 /etc/profile.d/pythonpath.sh
    source /etc/profile.d/pythonpath.sh
    hash -r
    
  • 然后,您可以选择通过以下方式安装最新版本的 pip 或任何其他 python 模块:

    pip install --upgrade <<PYTHON MODULE NAME>> --ignore-installed --install-option="--prefix=/usr/local" --log /var/log/<<PYTHON MODULE NAME>>-install-$(date "+%Y%m%d%H%M%S").log
    

    例如

    pip install --upgrade pip --ignore-installed --install-option="--prefix=/usr/local" --log /var/log/pip-install-$(date "+%Y%m%d%H%M%S").log
    hash -r
    # Notice the use of `hash -r` to refresh bash's hash table of recently
    # executable programs. Without doing this you may find that the 'pip'
    # command being used is not the version you just installed.
    

这会将请求的 Python 模块安装在/usr/local不会干扰系统包管理器管理的文件的位置。该--ignore-installed选项确保 pip 不会触及模块的现有版本。此外,由于使用了 PYTHONPATH 环境变量,这些/usr/local/lib*/python2.7/site-packages路径将在任何系统安装的软件包之前使用。 IE

[root@localhost ~]# python
Python 2.7.5 (default, Sep 15 2016, 22:37:39)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print '\n'.join(sys.path)

/usr/local/lib64/python2.7/site-packages        <---
/usr/local/lib/python2.7/site-packages          <---
/root
/usr/lib64/python27.zip
/usr/lib64/python2.7
/usr/lib64/python2.7/plat-linux2
/usr/lib64/python2.7/lib-tk
/usr/lib64/python2.7/lib-old
/usr/lib64/python2.7/lib-dynload
/usr/lib64/python2.7/site-packages
/usr/lib/python2.7/site-packages
>>>

最后,至少在 CentOS/RHEL 上,该/usr/local/bin路径位于 PATH 环境变量中任何其他系统二进制路径之前,因此这也确保 /usr/local/bin 中安装的任何较新的二进制文件优先于系统安装的二进制文件。 IE

[root@localhost ~]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

答案4

对于这里应该做什么有共识吗?

是的,不要手动修改系统管理的 Python 安装(运行 pip) - 请参阅运行“sudo pip”有哪些风险?要深入讨论该主题,请阅读 pip 的第 1668 期默认为--user以及其中相关的其他问题。

最常见的解决方案是:

  • 在用户主目录中安装 Python 包(用户方案
  • 从源代码编译 Python 并使用此实例而不是系统实例

理论上,另一种可能的解决方案是使用--targetpip 选项并设置PYTHONPATH环境变量。不过--target选项有很多(目前有 12 个)问题

相关内容