私は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-shared
2.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$
これはREADME
Python 2.7.13ドキュメントでは完全に文書化されていませんが、LD_*
Pythonビルドプロセスでこの欠陥を解決するためにトリック(または以下のELF操作アプリケーション)を使用できます。返品!可能であれば、基本バージョンでビルドしないでください。/usr/local
これにより、ビルド中のバージョンが存在する可能性のあるすべてのバージョンに混在します/usr/local
。プログラムが実際に必要ですが、実際のビルドを分離したい場合は、stow
GNUまたは同様の手順を使用できます。/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このリポジトリのファイルからインストールした後、単一のREADME
Pythonビルドとインストールを実行できます。
-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$