ルートアクセス権がないRHELにいくつかのPythonモジュールをインストールする必要があります。モジュールの少なくとも1つは、Python.h
へのアクセスも必要です。
この場合、pythonとその依存関係を~/local
にインストールすることが最善であることがわかりました。通常は正常に機能しますが、今回はPythonがSSLモジュールの構築に失敗します(以下の詳細を参照)。ここに私がやっていることの痕跡があります。
だから私はpython 6ソースをダウンロードし、私は行った:
./configure --prefix=/home/fds/rms/local
make >& make.log
ログを調べると、sslモジュールがコンパイルされていないことがわかりますが、原因については言及されていません(makeまたはconfigureでsslが他に発生していない)。
Failed to find the necessary bits to build these modules:
_bsddb _curses _curses_panel
_hashlib _sqlite3 _ssl <----------
だから、pythonはsslライブラリをまったく見つけていません(これは奇妙ですが、ちょっと...)。だから私はopenssl-0.9.8rをダウンロードして
./config --prefix=/home/fds/rms/local shared
make
make install
Pythonに戻って、。/ configureを実行し、もう一度作成します。失敗しますが、今回は異なります:
Failed to build these modules:
_hashlib _ssl
ログファイルを詳しく調べると、次のことがわかります。
gcc -pthread -shared build/temp.linux-x86_64-2.6/home/fds/rms/installers/Python-2.6.6/Modules/_ssl.o -L/home/fds/rms/local/lib -L/usr/local/lib -lssl -lcrypto -o build/lib.linux-x86_64-2.6/_ssl.so
*** WARNING: renaming "_ssl" since importing it failed: libssl.so.0.9.8: cannot open shared object file: No such file or directory
だから今、それはライブラリを拾い上げていますが、それを完全に正しくしていません(ファイルはあるべき場所にあります):
$ find /home/fds/rms/local -iname libssl.so.0.9.8
/home/fds/rms/local/lib/libssl.so.0.9.8
次に、makeをトレースして、ファイルを探している場所を確認します。
$ strace -f make 2>&1 | grep libssl.so.0.9.8
[pid 5584] open("/lib/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/usr/lib/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/lib64/tls/x86_64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/lib64/tls/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/lib64/x86_64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/lib64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/usr/lib64/tls/x86_64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/usr/lib64/tls/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/usr/lib64/x86_64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/usr/lib64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] write(1, "*** WARNING: renaming \"_ssl\" sin"..., 131*** WARNING: renaming "_ssl" since importing it failed: libssl.so.0.9.8: cannot open shared object file: No such file or directory
[pid 5584] open("/lib/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/usr/lib/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/lib64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/usr/lib64/tls/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] open("/usr/lib64/libssl.so.0.9.8", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 5584] write(1, "*** WARNING: renaming \"_hashlib\""..., 135*** WARNING: renaming "_hashlib" since importing it failed: libssl.so.0.9.8: cannot open shared object file: No such file or directory
うーん、それはすべての間違った場所を探しています。ヒントを与えようとします:
CPPFLAGS="-I/home/fds/rms/local/include -I/home/fds/rms/local/include/openssl" LDFLAGS="-L/home/fds/rms/local/lib" ./configure --prefix=/home/fds/rms/local
しかし、何も変わらず、make
は/home/fds/rms/local/lib
をまったく試さないようです。
私はこれを何年もしていないので、何かを見落としているかもしれません。誰でも問題を解決できますか?
前もって感謝します。
OpenSSLが標準の場所にない場合は、Modules/Setup.dist
を編集してOpenSSLの場所を指定する必要があります。から Python 2.5.1 でSSLサポートを取得する)==:
python(httplib.HTTPSConnectionやimaplib.IMAP4_SSLのようなものでクライアントを使用するために)でsslサポートを必要とするLinuxボックスで自分自身を見つけたら、数時間のハンティングを節約しましょうウェブ上で(もちろん、これを見つけた場合は、すでにある程度のレベルのハンティングを行ったことを意味します!).
次の例外メッセージが表示された場合、pythonインストールにsslサポートをコンパイルする必要があるかどうかがわかります。AttributeError: 'module' object has no attribute 'ssl'
それをなくすためにpythonコードを楽に続けるには、まずOpenSSLがインストールされていることを確認する必要があります。デフォルトでは、ソースからインストールされます:/ usr /ローカル/ SSL
そのディレクトリが存在しない場合は、ソースパッケージを取得します。
標準を実行します。
tar zxf openssl-0.9.8g.tar.gz cd openssl-0.9.8g ./config make make install
次に、2.5.1のpythonソースを取得し、tar zxf Python-2.5.1.tgz && cd Python-2.5.1を取得します。
次に、Modules/Setup.distを編集する必要があります。
204:# Socket module helper for SSL support; you must comment out the other 205:# socket line above, and possibly edit the SSL variable: 206:SSL=/usr/local/ssl 207:_ssl _ssl.c \ 208: -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \ 209: -L$(SSL)/lib -lssl -lcrypto
OpenSSLをデフォルトの場所にインストールした場合は、206-209行目をコメント解除するだけで済みます。
./configure make make install
次に、以下を使用してインストールを検証します。
python /usr/local/lib/python2.5/test/test_socket_ssl.py test_rude_shutdown ... test_basic ... test_timeout ...
ソースルート(たとえばModules/Setup.dist
)をクリーニングしてmake distclean
への変更が反映されていることを確認し、configure
とmake
を再度実行します。
bourneシェル(/ bin/shまたは/ bin/bash):
$ LD_LIBRARY_PATH=/usr/local/lib
$ export LD_LIBRARY_PATH
$ make
cシェル(/ bin/cshまたは/ bin/tcsh):
% setenv LD_LIBRARY_PATH /usr/local/lib
% make
私のためにModules/Setup
は_hashlib
モジュールは、間違ったOpenSSLバージョンを使用することになりました。およびLD_LIBRARY_PATH
は、SLESシステムの実行時に考慮されませんでした。
うまくいったのは、ローカルOpenSSLを両方の_ssl
および_hashlib
編集setup.py
ごと GitHubパッチ:eddy-geek/python_custom_openssl.diff 、その後make clean && make
。
コンパイル時にコアダンプpythonカスタムopensslバージョンで) でStack Overflowで静的リンクを使用した理由の詳細。
Python 2.7.11。で使用した完全なプロセスを次に示します。
最上位のPython2.7.11ソースディレクトリ:
変化する Modules/Setup.dist
、Modules/Setup
:コメントを解除_ssl
セクション、コメントアウト_socket
(既にコメントアウトされている場合は何もしません)、コメントを外してSSLを適切に設定します(新しいsslへのパスlib/includes
など)
注:Modules/Setupファイルは最初は存在しませんが、最初に実行した後、Modules/Setup.distからコンテンツを取得します。毎回実行する前に、ここに変更が反映されていることを確認してください。
パッチを適用: http://Gist.github.com/eddy-geek/9604982 (以前にmakeを実行した場合はdistcleanを作成)
./configure --prefix=/root/.local/aks/py-ssl/python2.7 --enable-shared
# modify: Makefile -> set svnversion to ""
make
make altinstall
以下の2および3の静的opensslおよび静的libintlのパッチをいくつか用意しています。
Openssl(最初のパッチ)の場合、env var OPENSSL_ROOTを設定する必要があります。
これは http://Gist.github.com/eddy-geek/9604982 からのパッチに基づいています。
Python 2.7.14:
https://Gist.github.com/rkitover/2d9e5baff1f1cc4f2618dee53083bd35
https://Gist.github.com/rkitover/afab7ed3ac7ce1860c43a258571c8ae1
Python 3.6.3:
https://Gist.github.com/rkitover/93d89a679705875c59275fb0a8f22b45
https://Gist.github.com/rkitover/b18f19eafda3775a9652cc9cdf3ec914
Opensslのログに戻るまで、私は同じ結果を得ていました。そこで、opensslをビルドするときに-fPICを使用する必要があることを見ました: '_ssl'拡張をビルドします:
gcc -pthread -fPIC -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/usr/local/ssl/include -I. -IInclude -I./Include -I/usr/local/include -I/home/feramos/Python-2.7.3/Include -I/home/feramos/Python-2.7.3 -c /home/feramos/Python-2.7.3/Modules/_ssl.c -o build/temp.linux-x86_64-2.7/home/feramos/Python-2.7.3/Modules/_ssl.o
gcc -pthread -shared build/temp.linux-x86_64-2.7/home/feramos/Python-2.7.3/Modules/_ssl.o -L/usr/local/ssl/lib -L/usr/local/lib -lssl -lcrypto -o build/lib.linux-x86_64-2.7/_ssl.so
/usr/bin/ld: /usr/local/ssl/lib/libcrypto.a(x86_64cpuid.o): relocation R_X86_64_PC32 against `OPENSSL_cpuid_setup' can not be used when making a shared object; recompile with -fPIC
openssl-0.9.8g]# .config -fPIC
次に、opensslのmake、make install、そしてPythonを再度ビルドします。
Python2.7.13をビルドしていますが、これと同じ問題が発生します。 2.7.13では、「openssl1.0.0e」以上を使用して機能させる必要があります。 openssl-0.9.8gを試しましたが、機能しません。そして、どういうわけか、Modules/Setup.distを変更するだけでは動作しないので、その_ssl.oを手動でコンパイルする必要があります。これは、私が提供したopenssl-0.9.8gが機能せず、機能しないシステムデフォルトlibssl.so.10を検索したためだと思います。
MAC OS High Sierra、およびPython-3.5.6上記の回答では、ソースを使用してopensslのインストールが行われますが、brewを使用してインストールする場合、インストールされたパッケージの場所がわかりますので、brewを使用してopensslをインストールする場合
brew install openssl
これにより、opensslが/ usr/local/Cellar/openssl/1.0.2o_2 /にインストールされます。このパスは、Modules/Setup.distで更新する必要があります。
opensslのインストール場所がModules/Setup.distを更新するために言及されていない場合、上記のこの回答に従ってください
上記の行でSSL値を更新します
SSL=/usr/local/Cellar/openssl/1.0.2o_2/
行のコメントを外し、CMMを実行すると、pythonがopensslでコンパイルされます。
-Wl,-rpath,/home/fds/rms/local/lib
をLDPATH
に追加してみてください。