Building Python 3.7.1 - SSL module failed

前端 未结 6 1534
北荒
北荒 2020-12-02 21:31

Building Python 3.7 from source runs into following error:

Failed to build these modules:
_hashlib              _ssl                                     

Co         


        
相关标签:
6条回答
  • 2020-12-02 21:40

    I solved it after 3 days only because of this blog. with python 3.7.4 openssl 1.1.0 centOS 6.

    here is the summary :

    First, some prerequisites:

    sudo apt-get install build-essential checkinstall libreadline-gplv2-dev libncursesw5-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev
    

    use yum instead of apt-get if using centos linux.

    Install ssl 1.0.2 or higher.

        cd /usr/src
        curl https://www.openssl.org/source/openssl-1.0.2o.tar.gz | tar xz
        cd openssl-1.0.2o
        ./config shared --prefix=/usr/local/
        sudo make
        sudo make install
    

    We will need to pass /usr/src/openssl-1.0.2o into the Python configure script.

    mkdir lib
    cp ./*.{so,so.1.0.0,a,pc} ./lib
    

    Now proceed with installing Python:

        cd /usr/src
        sudo wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz
        sudo tar xzf Python-3.7.0.tgz
        cd Python-3.7.0
        ./configure --with-openssl=/usr/src/openssl-1.0.2o --enable-optimizations
        sudo make
        sudo make altinstall
    

    To test it out, run python3.7 and input:

    import ssl
    ssl.OPENSSL_VERSION
    

    Hope it helps!

    0 讨论(0)
  • 2020-12-02 21:41

    On CentOS / Linux 2 if you install openssl using

    sudo yum install -y openssl-devel
    

    then the library is installed to /usr/local/lib64, and you can configure Python as follows:

    ./configure --enable-shared --with-openssl=/usr/local/lib64
    

    there are step-by-step instructions here: How to Install Latest (2020) Django to AWS EC2 Linux 2 Instance and Serve w/ Apache Hello World

    0 讨论(0)
  • 2020-12-02 21:44

    Here is a solution on Mac OS X / Homebrew:

    brew reinstall openssl
    brew unlink openssl && brew link openssl --force  # careful!
    export LDFLAGS="-L/usr/local/opt/openssl/lib"
    export CPPFLAGS="-I/usr/local/opt/openssl/include"
    echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile
    

    Then download your python tarball and do this:

    tar xvf Python-3.7.2.tar
    cd Python-3.7.2
      ./configure CPPFLAGS="-I/usr/local/opt/openssl/include" LDFLAGS="-L/usr/local/opt/openssl/lib" --prefix=$PWD/Python-3.7.2/mybuild --enable-optimizations
    

    More detai:

    https://devguide.python.org/setup/#macos-and-os-x

    0 讨论(0)
  • 2020-12-02 21:55

    Edit setup.py

    Find the following lines:

            system_lib_dirs = ['/lib64', '/usr/lib64', '/lib', '/usr/lib']
        system_include_dirs = ['/usr/include']
    

    ...and place each folder at the beginning of its respective list.


    In my case I had to add: /usr/local/lib and /usr/local/include:

            system_lib_dirs = ['/usr/local/lib', '/lib64', '/usr/lib64', '/lib', '/usr/lib']
        system_include_dirs = ['/usr/local/include', '/usr/include']
    

    Finally: make distclean && ./configure

    You may want to ensure that export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH (or what have you) is added to the very end of /etc/profile and reboot, as well.

    0 讨论(0)
  • 2020-12-02 21:58

    Compiling openssl

    Download your openssl tarball, unzip, and then ensure that the install directory is named openssl.

    I placed mine in /usr/local/openssl, so I'll use that in my example.

    1. sudo mv openssl-1.0.2u /usr/local/openssl && cd /usr/local/openssl

    2. sudo make distclean

    3. sudo ./config -fPIC -shared

    4. sudo make && sudo install

      Now, add the openssl shared library to your PATH.

    5. vim ~/.profile Go export PATH="/usr/local/openssl/lib:$PATH" :wq

    Compiling Python3

    The key here is understanding that the path you define with --with-openssl= is where Python looks for /openssl/lib. You need to give Python the parent directory of the openssl directory.

    That means that if you set --with-openssl=/usr/local/openssl your make install will fail even though the make logs show that openssl is fine!

    --enable-optimizations is irrelevant but recommended - longer make for 10% faster Python code is a good tradeoff.

    --prefix= is merely where I'd like python3 to install, if you didn't know.

    1. sudo make distclean

      Edit your python setup file

    2. vim /{yourpythonsource}/Modules/Setup

      Uncomment out the following lines and ensure that your SSL variable points to your openssl directory. In mine, it was looking for the directory 'ssl' instead of 'openssl.'

      # Socket module helper for SSL support; you must comment out the other

      # socket line above, and possibly edit the SSL variable:

      SSL=/usr/local/openssl _ssl _ssl.c \ -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \ -L$(SSL)/lib -lssl -lcrypto

    3. sudo ./configure --with-openssl=/usr/local --prefix=/opt/python-3.7.1

    4. sudo make && sudo make install

    0 讨论(0)
  • 2020-12-02 21:58

    While this might not be the best answer, I will share how I solved this problem.

    1. First of all, in my case, OpenSSL did not build correctly, as make test did return errors (and consequently Python gave this error). This was solved by installing a newer version of Perl and then installing OpenSSL again (configure, make, etc).

    2. Use this command before using ./configure

      export LD_LIBRARY_PATH=/path/to/openssl/lib:$LD_LIBRARY_PATH

    3. At the configure command, include the library:

      LDFLAGS="-L/path/to/openssl/lib" ./configure (all your preferred options) --with-openssl=/path/to/openssl

      as apparently the option for configure does not convey the message to the C compiler which needs it.

    Am not sure whether option 2 and 3 are needed simultaneously, but I did so and it worked.

    0 讨论(0)
提交回复
热议问题