前端时间,在debian10的机器上要使用比较新的版本的python,因此需要自己手动去编译一个。python用的少,这次做了,就记录一下,以后再用,可以回头看看。
1. 在编译之前,最好安装好libffi-dev,比如需要使用pyinstaller时,如果没有安装这个东西,就会报错,No module named '_ctypes',到时候就需要重新编译,费事。因此在动手之前,先安装上。
2. 下载tar.xz的源码,tar -xf解压缩后,进入文件夹执行:
./configure --prefix=/usr/local/bin/python3.8.2/ --with-openssl=/usr/local/openssl/ --enable-shared
--prefix是安装目录
--enable-shared是编译后,会生成python的库。如果需要使用pyinstall来编译可执行程序,那么需要带上这个选项。编译好后,make Install。但是发现,没有将生成的libpython*.so放到系统常见的路径下,比如/lib/x86_64-linux-gnu/,而且因为这个导致python无法运行。在命令行调用python3 --version,就会报错,说找不到libpython3.8.so.1.0。所以,在编译完后,手动将libpython3.8.so.1.0拷贝到/lib/x86_64-linux-gnu/下。然后再运行python3 --version就没有问题了。
--with-openssl=/usr/local/openssl/ 这个是让编译生成的python支持ssl。务必带上这个,不然后面使用编译后的pip去下载包的时候,如果是公网,比如清华的,那就必须得支持ssl。另外/usr/local/openssl是ssl所在的路径。这个路径下包括bin(里面有openssl),还有lib(里面有libcrypto.so和libssl.so),编译的过程中会链接lib下的库。如果没有openssl,那么下载openssl的包,解压缩后:
./config --prefix=/usr/local/openssl
make
make install
这里--prefix后面的就是make install时openssl的安装目录。注意make install时权限问题,像上面安装到/usr/local/openssl下,需要root权限。
对了,除了添加 --with-openssl=/usr/local/openssl/ ,还需要修改在python源码下Modules文件夹下Setup文件,修改内容:
就是修改SSL,SSL=,“=”右边的是openssl所在的路径
在python源代码文件夹下做完./configure后,执行make & make install.
这里建议make之前做一下make clean。因为如果曾经做过make,不带ssl,现在这里带上ssl,不clean直接make,还是会报错,未定义的openssl的一些函数。后来make clean后,再make,就没有问题。
创建快捷方式:
ln -s /usr/local/bin/python3.8.2/bin/python3 /usr/bin/python3
ln -s /usr/local/bin/python3.8.2/bin/pip3 /usr/bin/pip
pip批量安装:
pip install -r requirements.txt
如果pip install报错,pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
原因就是python不支持openssl,需要重新编译python,带上openssl。
pip install时报错,ERROR: Can not execute `setup.py` since setuptools is not available
这种情况下,需要安装setuptools,如下:
pip3 install --upgrade setuptools