Python pipにRPMがインストールされているモジュールを上書きする必要がありますか?

Python pipにRPMがインストールされているモジュールを上書きする必要がありますか?

Pythonpipと多くのPythonモジュールはCentOS Linuxリポジトリを介して提供されます。 CentOS 7.x Linuxでは、pip標準のDeployment Package Manager()を使用してインストールおよびインストールできます。pymongoyum install python-pip python-pymongo

ただし、リポジトリに提供されているバージョンはすでにpymongo古すぎます。のバージョンpipも通常遅れているので、すぐに実行することをお勧めしますpip install --upgrade pip

ここで何をすべきかについて合意がありましたか?アップデートを実行するとpipRPMのファイルが上書きされるため、パッケージマネージャから苦情を受け取ることができます。

pipRPMからモジュールをインストールしない方が良いですか?たぶん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モジュールの「システム全体」バージョンをアップグレードする必要がありますが、パッケージマネージャが管理するファイルを妨げたくない場合は、次のことを行う必要があります。

次のガイドラインは、利用可能なPythonバージョンが2.7.xの場合、RHEL派生オペレーティングシステムに適用されます。インストールされているPythonのバージョンと一致するようにPYTHONPATHを調整する必要があります。

  • python-pipのパッケージマネージャのバージョンがインストールされていることを確認してください。たとえばyum -y install python-pip

  • PYTHONPATH 環境変数を設定する profile.d スクリプトを作成します。

    # 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.
    

/usr/localこれにより、システムパッケージマネージャが管理するファイルを妨げない場所に要求されたPythonモジュールがインストールされます。この--ignore-installedオプションは、pipがモジュールの既存のバージョンに触れないようにします。また、PYTHONPATH 環境変数を使用するため、これらの/usr/local/lib*/python2.7/site-packagesパスはシステムにインストールされたパッケージの前に使用されます。つまり

[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にインストールされている最新のバイナリがシステムにインストールされているバイナリよりも優先されます。つまり

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

答え4

ここで何をすべきかについて合意されたのでしょうか。

はい、システム管理のPythonインストールを手動で変更しないでください(pipの実行) - 参照「sudo pip」を実行するリスクは何ですか?このトピックに関する詳細な議論については、pip Issue 1668を読んでください。デフォルトは --user です。そしてこれに関連するその他の問題。

最も一般的な解決策は次のとおりです。

  • ユーザーのホームディレクトリ(ユーザープラン)
  • ソースからPythonをコンパイルし、システムインスタンスの代わりにこのインスタンスを使用します。

--target理論的に別の考えられる解決策は、pipオプションを使用してPYTHONPATH環境変数を設定することです。しかし、--targetさまざまなオプションがあります(現在12個)。質問

関連情報