在linux上用运行python脚本(docker、非docker、虚拟 cona venv等)

528 阅读3分钟

方式一、python程序整体打包为docker镜像

直接将开发环境的python程序打包为容器镜像,上传到服务器上运行

使用pycharm编写程序

写py脚本,在pycharm里面可以运行

创建requirements.txt文件

在当前目录下,或者是项目根目录下面,创建requirements.txt文件

添加依赖包到requirements.txt文件

使用pycharm功能,Tool > sync Python requirements

Package Requirements file 选择刚创建requirements.txt的文件,点Ok即可创建

打开requirements.txt,检查有无问题

也可以自己根据编写的py脚本中的import的包,手动添加和修改requirements.txt文件

编写Dockerfile文件

Dockerfile位于要打包的py脚本同一级

# 使用官方 Python 镜像作为基础镜像
FROM python:3.10.0-slim-bullseye

# 设置工作目录
WORKDIR /program

# 将本地代码复制到镜像中
COPY . /program

# 安装依赖
RUN pip install -r requirements.txt

# 暴露端口(如果需要)
EXPOSE 83

# 执行应用程序
CMD ["python", "查询天气.py"]

开发环境(windows)安装Docker Desktop 

本地安装Docker环境

打包 

docker build -t my_python .

查看打包镜像

docker images

导出镜像

docker save -o my_python.tar my_python

镜像拷贝到服务器上

将my_python.tar上传至服务器上

运行镜像

加载镜像
docker load -i my_python.tar
运行镜像
docker run -p 83:83 my_python

测试

验证效果

如果有问题可以进入容器检查

方式2  单独的python脚本+python标准容器

在服务器上使用标准python镜像,创建容器,挂载我们开发的python脚本运行 使用docker部署python程序,好处是不用修改原有系统。

准备Docker基础环境 

确保系统上安装了docker、docker-compose 

当前测试的版本如下,其它版本估计也没问题 

Docker Version 20.10.3 
Docker Compose version v2.10.1

准备python基础环境

在线方式

拉取镜像

docker pull python:3.10.0

离线方式,下载已有的镜像

如果服务器没有外网,直接下载离线镜像(阿里云盘 /备份盘/安装包/语言/Python)

docker load -i python-3.10.0-docker-image-linux-x86_64.tar

离线方式,自己下载镜像,自己保存镜像

或者找个通外网的服务器,下载好了之后,使用docker save 下来

准备python程序环境

目录结构

/data/weather
----docker-compose.yml
----program
--------start.sh
--------stop.sh
--------get.py
--------common.py
--------...其他自己编写的文件
--------site-packages

工作目录

到当前工作目录
cd /data/weather
创建program目录
mkdir -p program/site-packages

拷贝py脚本

拷贝你的python程序(即py文件)到program目录中
如我的是 get.py

创建start.sh文件

在 program目录中创建start.sh
#!/bin/bash
cd /program
# 设置第三方包的路径
export PYTHONPATH="$PWD/site-packages"
python get.py

创建stop.sh文件

在 program目录中创建stop.sh
#!/bin/bash
pid=`ps -ef | grep python | awk '{print $2}'`
kill -9 $pid
return 0

拷贝第三方依赖包

从开发环境,把第三方依赖包拷贝到program/site-packages目录下
如requests、urllib3、chardet、charset_normalizer、idna
通过在开发环境cmd执行 
pip config list
可以查看到包的位置,
如global.target='D:\\ProgramData\\Python\\Python310\\site-packages'
一般情况下,开发的电脑上的第三方包,拷贝到服务器上就可以直接使用了。

一些特殊的包

有些特殊的包,如pandas、numpy等,内置了操作系统相关的dll或者so文件,因此无法从开发环境直接拷贝包到linux环境上去。

这类问题大多数报的错是找不到包。

可以在一台可以联网的linux上安装好了python容器,然后使用pip install numpy 这样的方式安装好了之后,再将这些包拷贝到目标linux服务器上。

创建docker-compose.yml文件

在工作目录/data/weather下面,添加docker-compose.yml

version: '3'
services:
  python_service:
    image: python:3.10.0
    container_name: "python_service"
    network_mode: bridge
    restart: always

    ports:
      - 83:83

    environment:
      - "LANG=en_US.UTF-8"

    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/hosts:/etc/hosts:ro
      - ./program:/program/

    entrypoint: ["/bin/bash", "-c" , "echo \"python service create succuss!!\" && sh /program/stop.sh &&  sh /program/start.sh "]

启动

在工作目录/data/weather下面,启动

docker-compose up

测试

测试是否达到预期

排查问题

打开另1个shell窗口,进入容器内部,进行排查

进入容器
docker exec -it python_service bash
检查进程ps -ef | grep python
cd /program
结束进程
sh stop.sh 
启动进程
sh start.sh

更新py脚本

更新program下面的get.py即可

方式三、非docker 直接执行py脚本

准备python环境

  • 安装python

在系统上安装python,编译-安装...等过程

这个方式会影响源系统

  • 复用现有的python安装包

将 python.3.10.1_centosx86-7.5.tar.gz(在其他系统上制作好) 上传到服务器上 /data/weather

这个方式会有小问题,因为python没有经过编译,例如ssl模块没有链接系统库文件,导致python的ssl模块不可用

准备py文件

将开发环境的py文件拷贝到 program目录中

准备第三方库

将用到的第三方库,拷贝到programs中

从开发环境,把第三方依赖包拷贝到program目录中
如requests、urllib3
通过在开发环境cmd执行 
pip config list
可以查看到包的位置,
如global.target='D:\\ProgramData\\Python\\Python310\\site-packages'

运行

/data/weather/python3/bin/python3 /data/weather/program/get.py

测试

检查效果

方式四、使用python虚拟环境

如 conda等虚拟环境,略... 后续补充