新加入团队后,发现Linux共享服务器上有多个python版本和多个python环境。而且整体也没有规划,很多都是各自维护自己的python开发环境和项目测试环境。因此也想着安装自己的python版本,构建自己的python环境。
1.多版本python环境安装
1.官网下载python版本
我这里目前使用python3.7.13
2.编译安装
--prefix
用于指定安装位置,这个很重要,不能使用默认的安装位置,以免覆盖别人的python环境。
# 配置
sudo ./configure --prefix=/home/ubuntu/python3.7 --enable-optimizations
# 编译
make
# 安装
make install
3.软连接建立
建立软连接方便自己在终端快速使用。另外,这里的软连接的名字也要注意跟其他人的环境区分开来。
sudo ln -s /home/ubuntu/python3.7/bin/pip3.7 /usr/bin/pip37lh
sudo ln -s /home/ubuntu/python3.7/bin/python3.7 /usr/bin/python37lh
4.设置pip包安装位置
需要修改一下pip包的默认安装位置,因为默认安装位置有可能是共享的位置,会造成不同人python环境的冲突。
- 查看pip包默认安装位置
python3lh -m site
- 设置pip包安装位置
修改site.py文件(python3.7/lib/python3.7/site.py)
USER_SITE = "/home/ubuntu/python3.7/lib/python3.7/site-packages"
USER_BASE = "/home/ubuntu"
2.virtualenv管理项目环境
针对项目环境,就没有必要每个项目按照一个python了,可以使用virtualenv在同一个python版本下建立多个项目环境。
-
- 安装virtualenv
pip install virtualenv
- 安装virtualenv
-
- 在当前目录创建paddleocr虚拟环境:
virtualenv paddleocr
- 在当前目录创建paddleocr虚拟环境:
-
- 切换到虚拟环境目录
cd paddleocr\Scripts
- 切换到虚拟环境目录
-
- 激活虚拟环境
windows:activate
linux:source bin\activate
接下来就可以在激活虚拟环境的终端直接使用python命名和pip命令了。
- 激活虚拟环境
注意问题
- 1.虚拟环境python、pip命令前加sudo时,调用的还是系统默认的python解释器,不是虚拟环境的,因此非必要不要加sudo。如果必须使用sudo提升权限的话,需要通过绝对地址或者相对地址指定目标python解释器。
- 2.跨服务器、跨python主环境的virtualenv虚拟环境是不能整个环境直接拷贝使用。跨主机迁移时,可以创建虚拟环境后,把虚拟环境下的
site-packages
打包拷贝到新环境中,经验证可以使用。 - 3.一般虚拟环境使用,我都是激活虚拟环境后,再执行应用的启动。但是在对接系统守护应用时,需要提供应用重启脚本。这里尝试了两种方式都是可以的。
- 直接指定虚拟环境的python解释器:
/home/../virtualenv-name/python app.py
- 编写bash脚本,切换目录,激活环境后,执行
python app.py
- 直接指定虚拟环境的python解释器:
3.多环境问题处理
1.no acceptable C compiler found in $PATH
执行 yum -y install gcc-c++
命令进行安装,
安装完后,输入gcc -v
检查是否安装成功。
2.No module named ‘_sqlite3’
-
1.使用命令
sudo apt install sqlite
安装sqlite -
2.重新编译安装python3.7无效解决方案一
查看python源码包中setup.py文件关于sqlite配置的路径,是否找到sqlite的相关文件。如果有差异,可以修改该文件,增加本地sqlite对应的路径即可。
# The sqlite interface
sqlite_setup_debug = False # verbose debug prints from this script?
# We hunt for #define SQLITE_VERSION "n.n.n"
# We need to find >= sqlite version 3.3.9, for sqlite3_prepare_v2
sqlite_incdir = sqlite_libdir = None
sqlite_inc_paths = [ '/usr/include',
'/usr/include/sqlite',
'/usr/include/sqlite3',
'/usr/local/include',
'/usr/local/include/sqlite',
'/usr/local/include/sqlite3',
'/usr/local/sqlite/include',
'/usr/local/sqlite/include/sqlite3'
]
if cross_compiling:
sqlite_inc_paths = []
MIN_SQLITE_VERSION_NUMBER = (3, 3, 9)
MIN_SQLITE_VERSION = ".".join([str(x)
for x in MIN_SQLITE_VERSION_NUMBER])
如果查找不到sqlite安装路径,可以考虑重新下载安装
# 下载安装包
wget https://www.sqlite.org/2018/sqlite-autoconf-3240000.tar.gz
# 解压
tar -xvzf sqlite-autoconf-3240000.tar.gz
# 进入目录
cd sqlite-autoconf-3240000/
# 编译
./configure --prefix=/usr/local/sqlite
# 安装
make -j4&&sudo make install
安装之后再进行上面的setup.py文件修改操作。
- 3.重新编译安装python3.7无效解决方案二
linux中存在多版本的python时,sqlite链接库默认安装在系统版本上,因此可能还是无法找到_sqlite3.s0
文件,因此重新编译安装无效。这时可以查找拷贝系统默认的python3.*下的_sqlite3.s0
到自己的环境中。
本机在默认环境python3.6下找到的是_sqlite3.cpython-36m-x86_64-linux-gnu.so
,需要重命名为_sqlite3.s0
sudo cp /usr/lib64/python3.6/lib-dynload/_sqlite3.cpython-36m-x86_64-linux-gnu.so
/usr/local/lib/python3.7/lib-dynload/_sqlite3.so
3.mlflow cli无法正常运行
由于安装mlflow模块的python环境不是系统默认环境,导致mlflow cli没有关联到系统path中,因此命令无法执行cli命令。要正常执行mlflow cli需要进行一下两步:
-
- 配置软连接链接多环境或者虚拟环境下的mlflow可执行程序。另外一种方案是执行命令时,切换到mlflow可执行所在目录,运行所在目录的mlflow可执行程序。
-
- 第一步操作后,如果运行有提示其他错误,可以查看mlflow可执行程序中的python解释器路径是否正确,要求切换为自己有效的python解释器路径。
# 下面一行用来指定解释器位置
#!/home/zz-admin/python3.7/bin/python3.7
# -*- coding: utf-8 -*-
import re
import sys
from mlflow.cli import cli
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(cli())
类似mlflow这样的安装了cli的python模块应该都会有类似的问题,可以参考处理。
多python环境下virtualenv的运行
- 切换到目标环境bin目录下
- 执行
./virtualenv paddleocr
这样才能够使用virtualenv正常创建虚拟环境。这也是因为多python环境virtualenv没有在系统默认的python环境下造成的。
14.No module named ‘_***’
- No module named ‘_bz2’
- Could not import the lzma module. Your installed Python is incomplete
- No module named ‘_ctypes’
类似这样的问题,主要是由于我们编译安装python的时候,linux并没有安装相应的模块。导致python也无法成功安装对应模块,这个问题其实python编译安装过程中有输出哪些模块没有安装成功,不过这种问题一般不影响python编译安装。都是在安装后,我们使用到了缺失的模块的时候会有提示,我们只要补充安装对应的linux模块,然后重新编译安装python就行。有两点说一下: - python环境的重新编译安装不会覆盖已经使用过程中的配置
- 安装了多个python环境时,注意设置–prefix,避免安装到错误路径
我没有创造知识,只是串联大佬们的经验,解决了自己的问题,记录下来。
参考博客
解决Python3 No module named '_sqlite3’错误
Python No module named ‘_sqlite3’ 解决方案
mlflow cli not linked in path after pip install #599