Pythonソースは異なるバージョンをコンパイルします。

Pythonソースは異なるバージョンをコンパイルします。

私は3日連続で悪夢を見ました。私がそうしたようにたくさん私はPythonのソースコードを何度も(今回は2.7.13)ダウンロードし、インターネットにアクセスできない環境でコンパイルしました(したがって、ソフトウェアの最新バージョンを入手する他の方法はありませんでした)。私はOracle Linux 7.3(RHELに似た環境)を使用しています。デフォルトではPython 2.7.5に付属していますが、いくつかのテストを実行してpip OOTBを入手するには最新バージョンが必要です。

私は一般的なことをしました:

# ./configure --enable-shared --with-ensurepip
# make
# make install

リクエストなどのpipを使用していくつかの追加パッケージをインストールしようとするまで、すべてがうまく実行されました。

[root@oel7 python_pkgs]# pip install requests-2.11.1/
Traceback (most recent call last):
  File "/usr/local/bin/pip", line 7, in <module>
    from pip import main
ImportError: No module named pip

うーん…では、実際にPythonがどこにインストールされているかを確認してみました。/usr/local/

[root@oel7 ~]# /usr/local/bin/python2.7 --version
Python 2.7.5

そのため、ソースディレクトリに実際に何が作成されたかを確認するために、生成されたバイナリをインストールせずにすべてを再コンパイルしてみました。

[root@oel7 Python-2.7.13]# make distclean
[root@oel7 Python-2.7.13]# ./configure --enable-shared --with-ensurepip
[root@oel7 Python-2.7.13]# ...
[root@oel7 Python-2.7.13]# make
[root@oel7 Python-2.7.13]# ...
[root@oel7 Python-2.7.13]# ./python --version
Python 2.7.5

私は今何をすべきかわかりません。生成されたバイナリに、そのバージョンがシステムにデフォルトでインストールされたバージョンとして表示されるのはなぜですか?私も成功せずに別のプレフィックスを使ってみました。

答え1

私は…まあ…とにかくこれはCentos 7でも起こります。 Centos 7はややRHELで、ややOracle Linuxです。ldd生成されたバイナリを実行すると注目に値します。

-bash-4.2$ ldd ./python
    linux-vdso.so.1 =>  (0x00007ffdb238e000)
    libpython2.7.so.1.0 => /lib64/libpython2.7.so.1.0 (0x00007fc691bfe000)
...

何らかの理由で、2.7.13ビルドはすでに/lib64/libpython2.7*システム全体のライブラリ(バージョン2.7.5)を使用しています。--enabled-shared2.7.13という正しいバージョンがありません。

-bash-4.2$ make distclean
...
-bash-4.2$ ./configure --disable-shared --with-ensurepip && make
...
-bash-4.2$ ldd ./python
    linux-vdso.so.1 =>  (0x00007ffffab95000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f59a15a2000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f59a139e000)
    libutil.so.1 => /lib64/libutil.so.1 (0x00007f59a119a000)
    libm.so.6 => /lib64/libm.so.6 (0x00007f59a0e98000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f59a0ad7000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f59a17d0000)
-bash-4.2$ ./python --version
Python 2.7.13
-bash-4.2$ 

これはREADMEPython 2.7.13ドキュメントでは完全に文書化されていませんが、LD_*Pythonビルドプロセスでこの欠陥を解決するためにトリック(または以下のELF操作アプリケーション)を使用できます。返品!可能であれば、基本バージョンでビルドしないでください。/usr/localこれにより、ビルド中のバージョンが存在する可能性のあるすべてのバージョンに混在します/usr/local。プログラムが実際に必要ですが、実際のビルドを分離したい場合は、stowGNUまたは同様の手順を使用できます。/usr/local/bin/python/usr/local/python-2.7.13

-bash-4.2$ make distclean
...
-bash-4.2$ ./configure --enable-shared --with-ensurepip --prefix=/usr/local/python-2.7.13
-bash-4.2$ make && sudo make install
...

まあ、このLD_RUN_PATH方法には2つのビルドが必要です。 2番目のビルドが必要です(最初のビルドは2.7.13libpython2.7ライブラリをインストールし、次のビルドはそれを選択して使用します)...

-bash-4.2$ make distclean
...
-bash-4.2$ ./configure --enable-shared --with-ensurepip --prefix=/usr/local/python-2.7.13
...
-bash-4.2$ LD_RUN_PATH=/usr/local/python-2.7.13/lib make
...
-bash-4.2$ ldd ./python
    linux-vdso.so.1 =>  (0x00007ffca7bcd000)
    libpython2.7.so.1.0 => /usr/local/python-2.7.13/lib/libpython2.7.so.1.0 (0x00007fc6534fb000)
...
-bash-4.2$ sudo make install
...
-bash-4.2$ /usr/local/python-2.7.13/bin/python --version
Python 2.7.13
-bash-4.2$ 

ELF修正ツールを使用してください。そのうちの1つは次のとおりです。https://github.com/NixOS/patchefこのリポジトリのファイルからインストールした後、単一のREADMEPythonビルドとインストールを実行できます。

-bash-4.2$ sudo rm -rf /usr/local/python-2.7.13
-bash-4.2$  ./configure --enable-shared --with-ensurepip --prefix=/usr/local/python-2.7.13
-bash-4.2$ make
-bash-4.2$ patchelf --set-rpath /usr/local/python-2.7.13/lib python
-bash-4.2$ sudo make install
-bash-4.2$ ldd /usr/local/python-2.7.13/bin/python
    linux-vdso.so.1 =>  (0x00007ffeb57ac000)
    libpython2.7.so.1.0 => /usr/local/python-2.7.13/lib/libpython2.7.so.1.0 (0x00007fcea6b75000)
...
-bash-4.2$ /usr/local/python-2.7.13/bin/python --version
Python 2.7.13
-bash-4.2$ 

関連情報