日期作者版本备注
2022-10-06dingbinthu@163.comV1.0

本文叙述在Linux Centos7系统下,在任意非标准目录(意味着不需要root或sudo权限)通过官方源码包编译安装Python3.9的快速安装指南。

因编译安装Python3.9可能需要安装一些前置依赖库如openssl,readline等,安装这些虽然也可以逐一下载源码编译安装,但略显繁琐,因此还是推荐通过yum 使用root或sudo权限一键安装前置依赖项。(因此又必须需要root或sudo权限)。当然如果你的系统这些前置依赖项都安装过了就不需要安装了因此还是可以不需要root或sudo权限的。

1. Yum一键安装前置依赖项

sudo yum -y install zlib zlib-devel bzip2 bzip2-devel ncurses ncurses-devel readline readline-devel openssl openssl-devel  openssl-static xz lzma xz-devel sqlite sqlite-devel gdbm gdbm-devel tk tk-devel libffi libffi-devel

2. 下载Python 3.9 官方源码包

https://www.python.org/downloads/ 下载Python 3.9.15 的源码包,百度云盘链接地址 。下载后的Python-3.9.15.tgz大约25M很小。

注意:我们还常常去pypi.org 官网上去下载python库。后面会简单叙述python如何在下载pypi.org上的库文件后执行安装操作的。

3. Linux下编译安装Python 3.9

cd ${TMP_DIR}
tar zxvf Python-3.9.15.tgz
cd Python-3.9.15
./configure  --enable-shared  --enable-optimizations CFLAGS=-fPIC --prefix=${INSTALL_DIR}
make
make install

这里加上--enable-shared和-fPIC之后可以将python3的动态链接库编译出来,一般是libPython.so,大概10-30M,生成的Python可执行程序的运行依赖于这个动态库。如果不指定改选项编译完成后则会生成一个libPython.a,生成的Python可执行程序就完全包好了该.a的全部内容就不依赖与该.a静态库了。但是如果编译第三方库需要python接口的比如caffe等,则会报错,所以这里建议加上上面的--enable-shared和-fPIC参数。注意: 如果哪天你要讲python可执行程序拷贝到别的机器,切记要连带上拷贝这个libPython.so.xxx。它的位置就在python安装目标目录下的lib目录下。--enable-optimizations 选项一般建议加上,它可以使得python执行时增速10%左右。

全程大约5-8分钟即可编译安装完毕。

4.Python可用初始配置

python3.9编译安装好之后,要到可用或好用状态,还需要如下初始配置。

4.1 .bashrc环境变量配置

注意:默认的python3高版本之后生成的可执行程序被命令为了python3 或pip3. 必须 为期建立python 和pip的软连接。如下操作:
cd ${INSTALL_DIR}/bin
ln -sf python3 python
ln -sf pip3 pip

接着在~/.bashrc中添加如下环境变量:

export  PYTHON39_HOME=${INSTALL_DIR}
export  PATH=${PYTHON39_HOME}/bin:${PATH}                       #使得python pip等可执行命令能被找到
export  LD_LIBRARY_PATH=${INSTALL_DIR}/lib:${LD_LIBRARY_PATH}   #使得libPython.so.xx等库能被找到

export  VIRTUALENVWRAPPER_PYTHON=${PYTHON39_HOME}/bin/python    #virtualenv-wrapper 使用的python解释器
export  WORKON_HOME=${HOME}/.venv.2022                          #virtualenv-wrapper使用python 配置根目录
source  ${PYTHON39_HOME}/bin/virtualenvwrapper.sh              #使得mkvirtualenv/workon/deactivate/                                                                      cpvirtualenv/lsvirtualenv/                                                                                cdvirtualenv/rmvirtualenv等命令能被找到

以上后面3行是virtualenvwrapper虚环境有关的环境变量和source设置,留待后面详细解释。

重新source ~/.bashrc后,执行如下命令,显然正常即表示设置有效。

第一次source 可能会报错-bash: /xxx/python39/bin/virtualenvwrapper.sh: No such file or directory,没关系,因为这时候virtualenvwrapper还没有安装,待下面操作安装好virtualenvwrapper之后这个文件自然就有了。
which python
which pip
python -V
pip -V

4.2 pip升级和配置

默认的python3.9这样的新版本Python已经默认自带安装了pip工具。因此已经不需要额外独立安装pip了。有关 pip要做的事情只有:

4.2.1 设置pip配置文件

mkdir ~/.pip    #是pip默认配置文件的所在目录,不存在要创建
vim ~/.pip/pip.conf 设置如下内容
注意windows 下该配置文件通常是C:\Users\<用户名>\pip\pip.ini
#~/.pip/pip.conf 内容
[global]
timeout = 10000
index-url=https://pypi.douban.com/simple
extra-index-url=https://mirrors.aliyun.com/pypi/simple/
#extra-index-url=https://pypi.tuna.tsinghua.edu.cn/simple/
#extra-index-url=http://pypi.mirrors.ustc.edu.cn/simple/

[install]
trusted-host=pypi.douban.com
#trusted-host=mirrors.aliyun.com
#trusted-host=pypi.tuna.tsinghua.edu.cn
#trusted-host=pypi.mirrors.ustc.edu.cn

4.2.2 升级pip如果不是最新版本的话。

#注意执行此命令之前一定要保证:which python 指向的是刚才安装的python位 置,才意味着升级的该位置下的pip,否则可能升级了本机其他位置的pip。
python -m pip install --upgrade pip

4.3 virtualenvwrapper安装和配置

python虚拟环境有很多,这里推荐使用强大的virtualenvwrapper。

4.3.1 安装virtualenvwrapper

注意:首次使用pip install 会报错找不到pbr,pbr是新一代python打包管理工具,相当于是setuptools的升级换代产品。虽然我们可以不用它,但我们还是需要一键安装 pbr。(就如同java打包我们可以继续使用maven而不使用新一代gradle一样)。
#安装pbr ,安装完之后${PYTHON39_HOME}/bin/pbr 可执行程序会被生成;${PYTHON39_HOME}/lib/python3.9/site-packages下也会生成pbr相关的包。
pip install pbr    

#安装virtualenvwrapper,安装完之后${PYTHON39_HOME}/bin下会新生成virtualenv, virtualenv-clone,virtualenvwrapper.sh, virtualenvwrapper_lazy.sh 4个文件。${PYTHON39_HOME}/lib/python3.9/site-packages下也会生成virtualenvwrapper相关的包。
pip install virtualenvwrapper  
注意: windows环境下需要执行的是pip install virtualenv virtualenvwrapper-win,安装好后windows下只需要在PATH中设置 WORKON_HOME环境变量即可,其他不需要设置。

4.3.2 配置virtualenvwrapper

在~/.bashrc添加如下3行有关virtualenvwrapper 配置如下:

export  VIRTUALENVWRAPPER_PYTHON=${PYTHON39_HOME}/bin/python    #virtualenv-wrapper 使用的python解释器
export  WORKON_HOME=${HOME}/.venv.2022                          #virtualenv-wrapper使用python 配置根目录
source  ${PYTHON39_HOME}/bin/virtualenvwrapper.sh              #使得mkvirtualenv/workon/deactivate/                                                                      cpvirtualenv/lsvirtualenv/                                                                                cdvirtualenv/rmvirtualenv等命令能被找到

重新source ~/.bashrc ,source ${PYTHON39_HOME}/bin/virtualenvwrapper.sh 就不会再报错找不到了。此时virtualenvwrapper相关的命令就可以使用了。

注意:virtualenvwrapper 相关命令如mkvirtualenv虽然可以使用,但若执行which mkvirtualenv时仍然找不到,因为它们是python函数。可以用 type -a mkvirtualenv 找到该命令的函数实现。

4.3.3 virtualenvwrapper 用法概述

virtualenvwrapper 作为极其强大的python虚拟环境,其常规用法一定要熟练使用。 如下:

命令含义和用法
mkvirtualenvmkvirtualenv -p /path/to/python --copies venv-test1
创建-p执行的python解释器对应的包环境作为虚拟环境包配置的python新的虚拟环境名为venv-test1. --copies 表示新虚拟环境是拷贝而不是链接源python解释器内的命令和包。--copies推荐必须带上该选项。
workonworkon 列举所有虚环境名称,作用同lsvirtualenv
workon venv-test1
进入venv-test1虚环境,workon和其他很多命令一样支持tab键候选存在的全部的虚拟环境名称列表
deactivate在某个虚拟环境内部时执行此命令可退出当前虚环境
lsvirtualenv列举所有虚环境名称
rmvirtualenvrmvirtualenv venv-test1
删除venv-test1虚环境
cdvirtualenvcdvirtualenv
必须在某个虚环境内部时执行此命令,可以直接进入到它的徐环境根目录下
cpvirtualenvcpvirtualenv venv1 venv2
拷贝虚环境venv1 为venv2

5. python 如何安装.whl和 .egg文件

egg文件是easy_install 即setuptools 包的对应python工程文件压缩包标准,是上一代的,whl文件是pip对应的压缩包标准,是用来替代egg文件的,两者现在都在用。Whl文件用的更多。在python第三方库中,除了源码和二进制exe之外,.whl文件和.egg文件也是两种常用的文件类型。

.whl文件 现在常见的一种二进制格式, 首先需要安装wheel库

pip install wheel

然后下载所需的.whl文件,最后用pip命令在.whl文件所在的位置安装,例如:

pip install h:/path/xxx.whl

.egg文件 是一种打包,后缀名可以改成rar,直接解压缩,按照源码的形式安装,即:

cd到.egg文件解压缩后的根目录下,执行
python setup.py install   #这就是所谓源码形式安装

.egg文件还可以通过easy_install命令安装如下:(不过新版本的python 3.X里已经没有easy_install命令了,也就没必要再使用这个命令了。)

easy_install  /xx/xx.egg

还有一种最简单的安装方法就是把egg文件和egg文件解压出来的文件夹直接复制到Python的第三方库文件夹..Lib\site-packages中

6. python -m 和 python 直接运行的区别

python -m 和 python 直接运行的区别现象如下:

>>> python xxx.py # 直接运行
>>> python -m xxx # 相当于import,叫做当做模块来启动

主要区别在于sys.path不同,直接运行会将该脚本所在目录添加至sys.path,而当做模块启动则会将当前运行命令的路径添加至sys.path。

实际应用中假设我们有如下文件结构:

package1/

|--__init__.py

|--mod1.py

package2/

|--__init__.py

|--run.py

在run.py中import了mod1.py

# run.py

from package1 import mod1

python run.py # 失败,提示找不到package1

# 切换到package2 所在目录

python -m package2.run # 成功

7. python项目跨机器迁移方案

当然,python虚拟环境只是隔离过个python项目的依赖库的最重要的方式之一,但如果是跨机器迁移python项目,我们推荐的做法还是如下:

  1. 在目标机器上源码编译安装同版本或相近版本python源码包。
  2. 在源机器上python项目对应的虚拟环境中执行pip freeze > requirements.txt 生成依赖包文件 requirements.txt
  3. 在目标机器上生成新的python虚环境,然后倒入源机器生成的requirements.txt文件,执行pip install -r requirements.txt

需要说明的是,如果是同机器上迁移或拷贝python项目,可选的方案如下:(推荐方案1和3)

  1. 使用cpvirtualenv
  2. 或者直接拷贝python虚环境项目
  3. pip freeze/install -r 冻结和新导入依赖库文件requirements.txt

apollo008
151 声望9 粉丝

走完这一生,如果我和你在一起会变得更好,那我们就在一起,否则我就丢下你。我回顾我最光辉的时刻就是和不同的人在一起,变得更好的最长连续时刻。