项目介绍
springboot 调用python文件,python调用另一个数据文件,然后计算出结果,看似简单,实际上有很多坑,因为涉及到python的三方库,有时候下载不下来,有时候版本不匹配,折腾了好久
之前的做法
之前我会在windows上通过docker docker desktop打包好,然后通过xftp传到服务器,结果集成了python环境,包竟然有将近6个G,一旦出错,又得重新上传,岂不是很费时间。所以在ubuntu服务器上打包,这样节省了很长时间,问题就是在服务器上部署,环境又很重要
分享
我先把打包好的jar包传到服务器上,然后要把之前的dockerfile进行路径修改,之前都是在工程里打包的
先看一下需要用到的python库
requirements.txt
numpy==1.24.4
pandas==2.0.3
torch==2.1.0
matplotlib==3.7.2
scipy==1.11.2
这个刚开始我用到了,后来我也不用了,因为运行时经常报丢依赖,看后边的说明
1.依赖包下载不下来
官方的python依赖包经常下载不下来,需要用国内镜像,国内镜像有的也不靠谱,比较烦
2.依赖包冲突
这个也是个问题,依赖包经常冲突
3.文件目录不存在
有时候没有权限,有时候创建文件目录失败,烦不胜烦
解决
分享一下docker相关的文件,希望对大家有帮助
首先用到的命令行
//第一次打包时,进行的配置
需要提前安装的python环境
docker pull python:3.9
docker pull openjdk:11-jdk-slim
在linux上,如果上述不行,用下边这个
sudo docker pull docker-0.unsee.tech/library/python:3.9
sudo docker pull docker-0.unsee.tech/library/openjdk:11-jdk-slim
//第一次打包时,报错进行的配置
# 备份原配置
sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
EOF
sudo systemctl restart docker
sudo docker pull docker-0.unsee.tech/library/python:3.9
pip install --upgrade pip
sudo yum install epel-release # 安装EPEL扩展源
sudo yum install python3-pip # 安装Python 3的pip
echo 'export PATH=$PATH:/usr/local/bin' >> ~/.bashrc # 添加路径
source ~/.bashrc # 立即生效
sudo mkdir -p /etc/docker # 确保目录存在
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://docker-0.unsee.tech","https://docker.1ms.run"]
}
EOF
后续打包
sudo docker build -t ring:1.0.0 .
sudo docker save -o ring_1_0_0_new.tar ring:1.0.0
这些也不见的全对,因为是我第一次打包时进行的配置,后来也修改了很多,只做参考
dockerfile
# 阶段1:Python环境构建
FROM docker-0.unsee.tech/library/python:3.9-slim as python-builder
# 修正阿里云源配置(兼容Debian 12+)
RUN sed -i 's|http://.*debian.org|https://mirrors.aliyun.com|g' /etc/apt/sources.list.d/debian.sources && \
apt-get update -o Acquire::Retries=5 && \
apt-get install -y --no-install-recommends \
build-essential \
python3-dev \
libatlas3-base && \
rm -rf /var/lib/apt/lists/*
# 安装指定版本的Python依赖
COPY /python/requirements.txt /
RUN pip config set global.index-url https://mirrors.aliyun.com/pypi/simple && \
pip install --no-cache-dir --upgrade pip==21.3.1 && \
pip install --no-cache-dir \
numpy==1.24.4 \
pandas==2.0.3 \
torch==2.1.0 \
matplotlib==3.7.2 \
scipy==1.11.2 && \
mkdir -p /python/raw_data && \
python -c "import numpy, pandas, torch, matplotlib, scipy; print(f'验证版本: numpy={numpy.__version__}, pandas={pandas.__version__}, torch={torch.__version__}, matplotlib={matplotlib.__version__}, scipy={scipy.__version__}')"
# 阶段2:最终镜像
FROM docker-0.unsee.tech/library/openjdk:11-jdk-bullseye
# 安装最小化Python环境
RUN apt-get update && \
apt-get install -y --no-install-recommends \
python3-minimal \
libatlas3-base && \
rm -rf /var/lib/apt/lists/* && \
ln -sf /usr/bin/python3 /usr/bin/python && \
mkdir -p /python/raw_data /home/ring/uploadPath /var/log/ring
# 复制Python依赖
COPY --from=python-builder /usr/local/lib/python3.9/site-packages/ /usr/local/lib/python3.9/site-packages/
COPY --from=python-builder /python/raw_data /python/raw_data
# 环境变量配置
ENV PYTHONPATH="/usr/local/lib/python3.9/site-packages:/python" \
PYTHONUNBUFFERED=1 \
LD_LIBRARY_PATH="/usr/local/lib/python3.9/site-packages/numpy/.libs:$LD_LIBRARY_PATH"
# 部署应用
COPY /ring.jar /ring.jar
COPY /python /python
RUN chmod 755 /ring.jar && \
python -c "import numpy; print(f'运行时验证: numpy={numpy.__version__}')" || \
(pip install --no-cache-dir -r /python/requirements.txt && \
python -c "import numpy; print(f'重装后验证: numpy={numpy.__version__}')")
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/ring.jar"]
这个里边有配置国内镜像,有配置环境变量,已经很简化了,python是我的目录,放置的是python文件,可以参考上一篇博客
DeepSeek使用注意点
这次成功,deepseek功不可没,但是也被坑了很长时间,最后总结了一下怎么使用deepseek
1.缺点:deepseek是参考了很多资料才给出的结果,所以上一次给出的答案,和下次给出的答案,有时候都不一样,甚至会把之前能用的代码给你改掉,我就遇到了一次,清华的镜像不可用,后边deepseek给换成了阿里的,然后后边又问了一些问题,又给我换回去了,然后越问越离刚开始的版本差别越大,最后还不如第一版
2.怎么用:如果有问题,要把所有的的配置都给它,然后它才好分析,然后如果有问题,需要修改的时候,尽量输入“保持之前的配置,只修改必要的部分”等,防止把之前能用的修改掉,然后如果它只是给出了关键部分,最好输入“给出修改过的全文”之类的,防止自己粘贴复制出错
3.deepseek是很不错,但是问题就是给人很大的自信,然后又发现它给的解决方法根本不能用,这个不要想着一次成功,需要有耐心一点,然后尽量多的给它资料,反正吧,比自己查资料来得快,但是也得学会自己分析,有时候可能路径问题,或者命名问题,这个不给它更多的资料,一般分析不出来