最近在搞涉及到机器学习的项目,需要用到python。本地开发爽歪歪,部署上线遇到了很多问题。特此记录。
说明
本地开发时,直接pip install
解决依赖,import
导入,愉快的调用包,一切很顺利。
但是部署上线的过程比较坎坷,碰到了以下几个问题:
- 线上机器没有安装python,安装python的机器和本地python版本不一致
- 线上机器没有外网,不能
pip install
- 线上机器运行了别人的python代码,依赖可能冲突
我的程序是用python3.7.9
开发的,线上有台机器装有python3.8.10
的环境,就只能凑合用了。
在本地用python3.7.9
导出依赖包,然后传到线上进行离线安装依赖,运行时发现python版本不一样导致报错。在本地再装一个python3.8.10
太费劲,于是用docker拉了个python3.8.10
,在它上面重新导出依赖,上传到线上运行成功。
为了防止与别的程序冲突,使用了python的虚拟环境venv
来部署。
目前程序运行还算正常。
分享以下几点操作:
- docker安装python
- pip离线安装包
venv
使用
docker安装python
用docker装python还是很简单的。
-
在Docker Hub上查找Python镜像。
-
找到后,执行
docker pull
。以3.8.10
为例docker pull python:3.8.10
-
查看/启动镜像
# 查看镜像列表 docker image ls -a # 启动镜像为容器 docker run -itd python:3.8.10 bash # 查看所有运行中的容器 docker ps
-
在
docker ps
结果中,找到python对应的containerId
,进入容器# 我的containerId是71c6aba263b9 docker exec -it 71c6aba263b9 bash
-
执行python命令
python --version
pip离线安装包
线上机器一般没有外网,所以离线安装包很有意义。
知道程序依赖哪些包
# 将本地所有的python包导出到requirements.txt
# 这是导出所有的包,不光是本项目的
pip freeze > requirements.txt
# 使用pipreqs模块可以导出本项目依赖的包
# 安装
pip install pipreqs
# 执行下面命令会将依赖导出到requirements.txt
# 执行时要指定编码,不然会报错
pipreqs . --encoding=utf-8
# 强制执行命令--force,覆盖原有的requirements.txt文件
pipreqs ./ --encoding=utf-8 --force
我在使用pipreqs时,发现导出的包不是很全。
不过依赖了哪些包,开发者应该比较清楚。
下载包到本地而不安装
执行
pip install <包名> -d <目录>
或
pip install -d <目录> -r requirements.txt
或
pip download --destination-directory <目录> -r requirements.txt
即可将包下载到指定目录。
如:
pip download --destination-directory /opt/project/py_req_mod -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
安装本地包
执行
pip install <目录>/<文件名>
或
pip install --use-wheel --no-index --find-links=wheelhouse/ <包名>
或
pip install --no-index -f=<目录>/ <包名>
即可安装。<包名>前有空格
如:
pip install --no-index --find-links=/opt/project/py_req_mod -r requirements.txt
venv
使用
venv
是python轻量级虚拟环境,其内的所有包不会对外界环境产生影响,只在虚拟环境内有效,很好的环境隔离。以下记录简单命令,详细可见参考。
# 创建虚拟环境文件夹
python -m venv python_venv
# linux激活虚拟环境
# 执行下面命令即可激活
cd /opt/project/p1/python_venv
source bin/activate
# 安装从本地导出的依赖
pip install --no-index --find-links=/opt/project/py_req_mod -r requirements.txt
# 执行我们的程序
python xxx.py
# 退出虚拟环境
deactivate
参考
pip安装依赖requirements.txt https://blog.csdn.net/deflypig/article/details/94425433
无网centos中部署python https://blog.csdn.net/SunJW_2017/article/details/89762571
pipreqs https://www.jianshu.com/p/5c30f7c5aa34
pip导出当前项目依赖包 https://blog.csdn.net/qq_43557600/article/details/108661926
Python3虚拟环境 venv搭建轻量级虚拟环境 https://blog.csdn.net/qq_22022063/article/details/78979367