linux多版本python安装

  • Post author:
  • Post category:linux


新加入团队后,发现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版本下建立多个项目环境。

    1. 安装virtualenv

      pip install virtualenv
    1. 在当前目录创建paddleocr虚拟环境:

      virtualenv paddleocr
    1. 切换到虚拟环境目录

      cd paddleocr\Scripts
    1. 激活虚拟环境

      windows:

      activate


      linux:

      source bin\activate


      接下来就可以在激活虚拟环境的终端直接使用python命名和pip命令了。



注意问题

  • 1.虚拟环境python、pip命令前加sudo时,调用的还是系统默认的python解释器,不是虚拟环境的,因此非必要不要加sudo。如果必须使用sudo提升权限的话,需要通过绝对地址或者相对地址指定目标python解释器。
  • 2.跨服务器、跨python主环境的virtualenv虚拟环境是不能整个环境直接拷贝使用。跨主机迁移时,可以创建虚拟环境后,把虚拟环境下的

    site-packages

    打包拷贝到新环境中,经验证可以使用。
  • 3.一般虚拟环境使用,我都是激活虚拟环境后,再执行应用的启动。但是在对接系统守护应用时,需要提供应用重启脚本。这里尝试了两种方式都是可以的。

    1. 直接指定虚拟环境的python解释器:

      /home/../virtualenv-name/python app.py
    2. 编写bash脚本,切换目录,激活环境后,执行

      python app.py



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需要进行一下两步:

    1. 配置软连接链接多环境或者虚拟环境下的mlflow可执行程序。另外一种方案是执行命令时,切换到mlflow可执行所在目录,运行所在目录的mlflow可执行程序。
    1. 第一步操作后,如果运行有提示其他错误,可以查看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



版权声明:本文为aizaiyishunjian原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。