如何将Python程序部署到服务器上(2024)

884 阅读3分钟

简介

当你写了个python小程序,在本地运行一段时间后,想让它在服务器上运行,因为服务器可以7x24小时持续不断的执行程序或者执行速度比本地机器要快,等等原因。然后你是不是直接就把代码目录给整个上传到服务器上了?如果是,那么别再用这么原始的方法啦!这篇文章将告诉你一种正确的部署方式。

通过将整个代码目录复制到服务器上,确实可以让程序在服务器上运行,但这会上传很多不需要的文件,比如你的开发环境配置文件,你的本地缓存文件等等。那么到底应该如何正确部署python呢,其实很简单!

运行环境

以下的操作命令均在Ubuntu或者WSL(Windows Subsystem for Linux)环境下执行。

本地打包

安装打包工具

在python中有很多打包工具,比如:hatchlingpdm-backendpoetry 以及 setuptools (>=61)等等。这些工具中有很多不仅仅只是用来打包,更多的是建立不同的python开发环境。

比如你有一些python程序,使用了同一个库的不同版本,那么你就得建立不同的环境来分别运行这些程序了。但如果只是为了打包,那我们只要选择一个相对比较简单的工具就可以了,比如setuptools (>=61)就很好,支持PEP 621标准。这样我们只要在项目中新建一个pyproject.toml配置文件就能打包了。

更新安装源:

sudo apt update
sudo apt upgrade

安装venv:(根据你的python版本选择,假设当前版本是3.10)

sudo apt install python3.10-venv

安装setuptools:

pip3 install --upgrade setuptools

安装build:

pip3 install --upgrade build

编写配置文件

在项目的根目录下新建一个pyproject.toml配置文件,然后填写如下内容:

  1. 设定打包构建的工具:
[build-system]
requires = ["setuptools"]
build-backend = "setuptools.build_meta"
  1. 填写自己项目的信息,比如项目名、版本以及引用到哪些其他的包,下面以引用request包为例说明:
[project]
name = "mypackage"
version = "0.0.1"
dependencies = [
    "requests"
]
  1. 如果你想通过文件名直接运行自己的python程序,就像是运行一个可执行文件那样,那么就增加如下信息:指定你要运行的方法名,格式为包名:方法名:(多级包名用.分隔,比如abc.def)
[project.scripts]
mycmd = "mypackage:method"

等部署完成后,就能在命令行中输入mycmd来运行你的python程序了。

执行打包命令

在项目的根目录中,执行以下命令:

python3 -m build

执行完成后,会在项目中生成一个dist目录,目录中有一个.whl文件和一个tar.gz文件,将这两个文件上传到服务器上。

部署

登录服务器,进入包含上面两个文件的所在目录中,执行如下命令:(假设当前的.whl文件名为mypackage.whl)

pip3 install mypackage.whl

如果是更新程序,则加上upgrade参数:

pip3 install --upgrade mypackage.whl

这样就将程序从本地部署到服务器上了,你现在可以用之前自定义的命令名(mycmd),在服务器终端的任何目录下执行你的python程序了。

最后

除了手动上传.whltar.gz文件到服务器上部署外,还可以选择在本地打包后,通过工具上传到PyPI中,这样就不用手工上传任何文件到服务器上,在服务器上执行常规的pip3安装命令就行了。但上传到PyPI之前,需要先进行注册并获取API token,所以如果你只是想简单的部署程序到服务器上,也不用分发给别人使用时,用本文的方法就可以了。简单够用就好,不是吗:)

参考资料

Quickstart - setuptools 69.0.3.post20240124 documentation (pypa.io)

Entry Points - setuptools 69.0.3.post20240124 documentation (pypa.io)

Packaging Python Projects - Python Packaging User Guide