发布 Python 程序是将你的代码打包并分发给用户的过程。根据目标用户和部署环境的不同,Python 程序有多种发布方式。
1. 源代码直接发布
1.1 纯 Python 脚本发布
适用场景:
-
简单的脚本工具
-
开发者或技术用户使用
-
内部工具分发
发布步骤:
-
确保代码有清晰的文档(README.md)
-
创建
requirements.txt或pyproject.toml文件 -
打包:
tar -czvf myapp.tar.gz myapp/ zip -r myapp.zip myapp/
优点:
-
简单直接
-
无需额外工具
缺点:
-
用户需要安装 Python 和依赖
-
不适合非技术用户
2. 使用 pip 发布到 PyPI
2.1 标准库打包 (setuptools)
适用场景:
-
库/框架开发
-
开源项目
-
希望用户通过 pip 安装的项目
发布步骤:
-
创建标准项目结构:
mypackage/ ├── mypackage/ │ ├── __init__.py │ └── module.py ├── tests/ ├── setup.py ├── pyproject.toml └── README.md
-
编写
setup.py:from setuptools import setup, find_packages setup( name="mypackage", version="0.1", packages=find_packages(), install_requires=[ 'requests>=2.25.1', ], ) -
构建和发布:
python -m pip install --upgrade build twine python -m build twine upload dist/*
2.2 现代打包 (pyproject.toml)
推荐方式:
[build-system]
requires = ["setuptools>=42", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "mypackage"
version = "0.1"
description = "My awesome package"
authors = [{name = "Your Name", email = "you@example.com"}]
dependencies = ["requests>=2.25.1"]
优点:
-
官方推荐方式
-
易于版本管理和依赖管理
-
方便用户安装
缺点:
-
需要用户有 Python 环境
-
不适合 GUI 应用
3. 可执行文件打包
3.1 PyInstaller
适用场景:
-
打包为独立可执行文件
-
Windows/macOS/Linux 桌面应用
-
需要分发给非技术用户
使用方法:
pip install pyinstaller pyinstaller --onefile --windowed myscript.py
高级选项:
-
添加图标:
--icon=app.ico -
打包数据文件:
--add-data="data/*;data" -
排除模块:
--exclude-module=unnecessary
3.2 cx_Freeze
适用场景:
-
比 PyInstaller 更简单的替代方案
-
需要自定义打包过程
使用方法:
-
创建
setup.py:from cx_Freeze import setup, Executable setup( name="MyApp", version="0.1", description="My Application", executables=[Executable("myscript.py")] ) -
构建:
python setup.py build
3.3 Nuitka
适用场景:
-
需要将 Python 编译为本地代码
-
追求更高性能
-
需要更好的反编译保护
使用方法:
pip install nuitka python -m nuitka --standalone --onefile myscript.py
优点:
-
生成真正的可执行文件
-
性能更好
-
更好的保护源代码
缺点:
-
构建时间较长
-
文件体积较大
容器化部署
1 Docker 打包
适用场景:
-
服务端应用
-
微服务架构
-
需要环境隔离
Dockerfile 示例:
FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD ["python", "app.py"]
构建和运行:
docker build -t myapp . docker run -p 5000:5000 myapp
2 多阶段构建(优化镜像大小)
# 构建阶段 FROM python:3.9 as builder WORKDIR /app COPY requirements.txt . RUN pip install --user -r requirements.txt # 运行阶段 FROM python:3.9-slim WORKDIR /app COPY --from=builder /root/.local /root/.local COPY . . ENV PATH=/root/.local/bin:$PATH CMD ["python", "app.py"]
优点:
-
环境一致性
-
易于部署
-
资源隔离
缺点:
-
需要 Docker 环境
-
镜像体积较大
系统服务打包
1 Debian/Ubuntu (.deb)
使用 dh-virtualenv:
# 安装工具 sudo apt install dh-virtualenv # 创建包结构 mkdir -p myapp/debian # 添加 control 文件等 dpkg-buildpackage -us -uc
2 RedHat/CentOS (.rpm)
使用 FPM:
gem install fpm fpm -s python -t rpm setup.py
3 Windows (MSI/EXE)
使用 WiX Toolset 或 Inno Setup
云服务部署
1 AWS Lambda
使用 Serverless Framework:
# serverless.yml
service: myapp
provider:
name: aws
runtime: python3.9
functions:
hello:
handler: handler.hello
events:
- http:
path: /hello
method: get
2 Google Cloud Functions
部署命令:
gcloud functions deploy my_function \ --runtime python39 \ --trigger-http \ --allow-unauthenticated
3 Azure Functions
使用 Azure CLI:
func init MyFunctionProj --python func new --name MyFunction --template "HTTP trigger" func azure functionapp publish <APP_NAME>
发布策略
-
库/框架:发布到 PyPI
-
命令行工具:PyPI + Homebrew/Linux 仓库
-
桌面应用:
-
Windows: PyInstaller + Inno Setup
-
macOS: PyInstaller + DMG
-
Linux: Snap/Flatpak/AppImage
-
-
Web 服务:
-
小型:Docker
-
大型:Kubernetes
-
-
无服务器:Lambda/Cloud Functions
版本管理和更新
-
语义化版本 (SemVer):
-
MAJOR.MINOR.PATCH
-
1.0.0 → 1.0.1 (补丁) → 1.1.0 (功能) → 2.0.0 (重大变更)
-
-
自动更新机制:
-
桌面应用:使用
pyupdater -
库/框架:通过 pip 更新
-
安全考虑
-
依赖安全:
pip-audit safety check
-
代码混淆(如果需要):
-
使用
pyarmor -
注意:真正的安全需要服务端验证
-
-
敏感信息:
-
永远不要打包在代码中
-
使用环境变量或配置服务
-
发布检查清单
-
代码测试通过
-
文档完整
-
版本号更新
-
依赖项检查
-
许可证明确
-
打包配置正确
-
目标平台测试
-
发布渠道准备
-
更新日志编写
通过以上方法,可以根据项目需求选择最适合的发布方式,确保 Python 应用能够顺利到达用户手中并稳定运行。
865

被折叠的 条评论
为什么被折叠?



