비표준 위치에서 SSL 지원으로 Python 빌드
루트 액세스 권한이없는 RHEL에 여러 Python 모듈을 설치해야합니다. 하나 이상의 모듈도에 액세스해야 Python.h
합니다.
이 경우 가장 좋은 방법은 Python을 설치하는 것이며 ~/local
. 일반적으로 작동하지만 이번에는 Python이 SSL 모듈을 빌드하지 못합니다 (아래 세부 정보 참조). 여기 내가하는 일의 흔적이 있습니다.
그래서 나는 파이썬 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 <----------
그래서 나는 파이썬이 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
Mhhh, 모든 잘못된 곳을 찾고 있습니다. 힌트를 드리려고합니다.
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
.
나는 이것을 몇 년 동안 해본 적이 없어서 아마도 나는 무언가를 간과하고있을 것이다. 누구든지 문제를 도울 수 있습니까?
미리 감사드립니다.
Modules/Setup.dist
표준 위치가 아닌 경우 OpenSSL의 위치를 지정 하도록 편집해야합니다 . 에서 파이썬 2.5.1에서 SSL 지원 받기 :
httplib.HTTPSConnection 또는 imaplib.IMAP4_SSL과 같은 클라이언트를 사용하기 위해 Python에서 SSL 지원이 필요한 Linux 상자를 사용하는 경우 웹에서 몇 시간 동안 사냥하는 시간을 절약 할 수 있습니다 (물론 이것은 당신이 이미 레벨 사냥을했다는 것을 의미합니다!).
다음 예외 메시지가 표시되면 Python 설치에 컴파일 된 SSL 지원이 필요한지 알 수 있습니다. AttributeError : 'module'object has no attribute 'ssl'
계속해서 즐겁게 파이썬 코드를 슬링 할 수 있도록이를 없애려면 먼저 OpenSSL이 설치되어 있는지 확인해야합니다. 기본적으로 / usr / local / 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
모듈이 여전히 잘못된 OpenSSL 버전을 사용 Modules/Setup
하기 때문에 저에게는 편집 만으로는 충분하지 않았습니다 _hashlib
. 그리고 LD_LIBRARY_PATH
내 SLES 시스템에서 실행시에 고려되지 않았다.
What worked was to statically link the local OpenSSL to both _ssl
and _hashlib
by editing setup.py
as per GitHub patch: eddy-geek/ python_custom_openssl.diff, and then make clean && make
.
More details on why I used static links on Stack Overflow at Coredump when compiling python with a custom openssl version.
Here is the complete process I used with Python 2.7.11.
In top level Python2.7.11 source dir:
Change
Modules/Setup.dist
,Modules/Setup
: Uncomment_ssl
section, comment out_socket
(no-op if it's already commented out), uncomment and set SSL appropriately (path to your new ssllib/includes
etc.)Note: Modules/Setup file does not exist initially but after first run it get's content from Modules/Setup.dist i believe. Make sure changes are reflected in here before every run.
Apply patch: http://gist.github.com/eddy-geek/9604982 (make distclean if previously ran make)
./configure --prefix=/root/.local/aks/py-ssl/python2.7 --enable-shared # modify: Makefile -> set svnversion to "" make make altinstall
I was getting the same result until I got back to the logs for openssl. There I saw that you need to use -fPIC when building openssl: building '_ssl' extension:
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
then, make, make install for openssl and then build Python again.
I have a set of a couple of patches for static openssl and static libintl for 2 and 3 below.
For openssl (first patch) you have to set the env var OPENSSL_ROOT.
This is based on the patch from http://gist.github.com/eddy-geek/9604982 .
For Python 2.7.14:
https://gist.github.com/rkitover/2d9e5baff1f1cc4f2618dee53083bd35
https://gist.github.com/rkitover/afab7ed3ac7ce1860c43a258571c8ae1
For Python 3.6.3:
https://gist.github.com/rkitover/93d89a679705875c59275fb0a8f22b45
https://gist.github.com/rkitover/b18f19eafda3775a9652cc9cdf3ec914
I'm building Python2.7.13 and I see this same issue. For 2.7.13 you have to use "openssl1.0.0e" or above to make it work. I tried openssl-0.9.8g and it doesn't work. And somehow I can't make it work just modifying Modules/Setup.dist so I have to manually compile that _ssl.o. I guess this is because openssl-0.9.8g I provided is not working and it searched for system default libssl.so.10 which doesn't work either.
Try adding -Wl,-rpath,/home/fds/rms/local/lib
to LDPATH
.
For MAC OS HIGH Sierra, and Python-3.5.6 In the above answer the openssl installation is done using source,but if you install using brew it tells where the installed package is, so if you install openssl using brew
brew install openssl
This will install openssl at /usr/local/Cellar/openssl/1.0.2o_2/ this path needs to be updated in Modules/Setup.dist at
In the above lines update SSL value to
SSL=/usr/local/Cellar/openssl/1.0.2o_2/
and uncomment the lines, do a CMM and your python will get compiled with openssl.
ReferenceURL : https://stackoverflow.com/questions/5937337/building-python-with-ssl-support-in-non-standard-location
'programing tip' 카테고리의 다른 글
마이크로 벤치마킹이란 무엇입니까? (0) | 2020.12.31 |
---|---|
커밋 할 때마다 git에 파일을 추가해야합니까? (0) | 2020.12.31 |
일정 횟수의 실행 후 반복 실행되도록 예약 된 Runnable을 중지하는 방법 (0) | 2020.12.31 |
Google 크롬을 사용하여 HTML 페이지에 포함 된 자바 스크립트 디버깅 및 편집 (0) | 2020.12.31 |
getString ()과 getResources.getString ()의 차이점 (0) | 2020.12.31 |