如何打包和分发Python应用程序
介绍
所有 Python 库(即 您使用包管理器下载的应用程序包(例如 pip) 是使用专用于完成这项工作的实用程序分发的。 这些实用程序创建“Python 发行版”,基本上是版本化(和压缩)档案。 所有与分发内容相关的元素,例如源文件和资源文件,都包含在其中。
在这篇 DigitalOcean 文章中,我们将讨论分发的必要工具,并介绍允许您打包自己有用的库、模块或应用程序的关键步骤——这将有助于您在 droplet 上部署项目或共享在互联网上。
Python 发行版和软件包
即使您只使用过一点 Python,您也会熟悉使用包管理器的概念(例如 pip, easy_install) 下载模块和库(例如 应用程序开发框架),然后将其导入并用于创建新框架。
这些包管理工具在本地运行,连接到源(即 Python 包索引 - PyPI)并执行所需的操作(例如 搜索并安装),因为他们使用这些资源,这些资源实际上被称为 Python 发行版。
分发应用程序的方式包括用一些必备文件(以及一些推荐的文件)包装其目录,指定相关元素(例如 资源、依赖项等)并在其他地方发布或使用它……就这么简单。
注意: 强烈建议您使用虚拟环境来隔离您正在使用的 Python 下载、模块和应用程序。
Python 包
在 Python 中,包 [技术上] 是一个包含源文件(即 模块)。 这不应与操作系统包混淆,操作系统包是 [技术上] 实际应用程序(即 一个 Debian 软件包)。 然而,必须注意的是,Python 发行版也确实被称为包。
示例包结构:
package | |-- __init__.py
Python 应用程序
尽管从单个文件到数百个分散在各种 包 中的文件都可以被视为 Python 中的应用程序,但在大多数实际场景中,应用程序将包含多个模块和一定数量的外部导入(来自库)。
示例应用程序结构:
myapp | |-- __init__.py |-- amodule.py |-- anothermod.py |__ tests | | | |-- __init__.py | |-- .. | |-- . | ..
Python 分发工具和库
鉴于 Python 的流行特性以及为它编写的大量第三方库/应用程序,一种更简单统一的分发方式一直是必要的。 有几种不同的工具和库用于创建 Python 发行版。
为了处理分发任务,创建了 Python 分发实用程序工具集 distutils。
Python 包索引 (PyPI)
Python 包索引或 PyPI 是项目(Python 发行版)的中央 [在线] 存储库。 包管理工具(例如 pip)使用此存储库来托管、查找和安装它们。
入门
让我们从创建一个简单、通用的 Python 烧瓶应用程序 [结构] 开始,然后我们可以使用它来打包。
创建应用程序结构
我们的目标是创建一个类似于大多数现实世界项目的示例。 因此,最好想象一个具有模块化组件的场景。
示例结构:
/MyApplication |-- run.py |-- config.py |__ /app |-- __init__.py |-- /module_one |-- __init__.py |-- controllers.py |-- models.py |__ /templates |-- module_one |-- hello.html |__ /static |__ .. |__ .
创建文件夹:
mkdir ~/MyApplication cd ~/MyApplication touch run.py touch config.py mkdir app cd app touch __init__.py mkdir templates mkdir static mkdir module_one cd module_one touch __init__.py touch controllers.py touch models.py cd ../templates mkdir module_one cd module_one touch hello.html
使用 nano 编辑 run.py:
nano ~/MyApplication/run.py
放置内容:
# Run a test server. from app import app app.run(debug=True)
使用 CTRL+X 保存并退出并使用 Y 确认。
使用 nano 编辑 config.py:
nano ~/MyApplication/config.py
放置内容:
DEBUG = True THREADS_PER_PAGE = 4 CSRF_ENABLED = True CSRF_SESSION_KEY = "secret"
使用 CTRL+X
保存并退出,并使用 Y
确认。
使用 nano 编辑 app/init.py:
nano ~/MyApplication/app/__init__.py
放置内容:
from flask import Flask, render_template app = Flask(__name__) app.config.from_object("config") from app.module_one.controllers import module_one app.register_blueprint(module_one)
使用 CTRL+X 保存并退出并使用 Y 确认。
使用 nano 编辑 app/module_one/controllers.py:
nano app/module_one/controllers.py
放置内容:
from flask import Blueprint, request, render_template module_one = Blueprint("auth", __name__, url_prefix="/auth") @module_one.route("/hello") def hello(): return render_template("module_one/hello.html")
使用 CTRL+X
保存并退出,并使用 Y
确认。
放置内容:
使用 nano 编辑 app/templates/module_one/hello.html:
nano app/templates/module_one/hello.html
放置内容:
{% block title %}我的站点{% endblock %} {% block css %} {% endblock %} 你好,世界!
使用 CTRL+X 保存并退出并使用 Y 确认。
从应用程序分发/打包开始
在创建了一个使用 Flask 的网站的示例应用程序结构之后,我们可以继续迈出准备分发的第一步。
更改文件夹结构
为了很好地打包我们的应用程序,我们需要对我们的文件夹结构做一些补充。
/MyApplication |-- run.py |__ /app |-- __init__.py |-- /module_one |-- __init__.py |-- controllers.py |-- models.py |__ /templates |-- module_one |-- hello.html |__ /static |__ .. |__ . |-- setup.py # Distribution setup file |-- README.txt # Read-me file |-- MANIFEST.in # Distribution manifest file |-- CHANGES.txt # Changes log
更改文件夹结构以创建必要的文件:
touch ~/MyApplication/setup.py touch ~/MyApplication/README.py touch ~/MyApplication/MANIFEST.py touch ~/MyApplication/CHANGES.py mv ~/MyApplication/run.py ~/MyApplication/bin/run
创建 setup.py
nano ~/MyApplication/setup.py
放置以下不言自明的内容:
from distutils.core import setup setup( # Application name: name="MyApplication", # Version number (initial): version="0.1.0", # Application author details: author="name surname", author_email="name@addr.ess", # Packages packages=["app"], # Include additional files into the package include_package_data=True, # Details url="http://pypi.python.org/pypi/MyApplication_v010/", # # license="LICENSE.txt", description="Useful towel-related stuff.", # long_description=open("README.txt").read(), # Dependent packages (distributions) install_requires=[ "flask", ], )
使用 CTRL+X 保存并退出并使用 Y 确认。
创建 MANIFEST.in
如果您需要发送额外的目录(例如 静态或模板),您需要在要打包的 manifest 中明确声明它们。 我们将在 MANIFEST.in
中执行此操作。
nano ~/MyApplication/MANIFEST.in
放置以下不言自明的内容:
recursive-include app/templates * recursive-include app/static *
使用 CTRL+X 保存并退出并使用 Y 确认。
就是这样! 您的 Python 分发包已准备好安装和发布。
附加文件
请记住,为了获得完整的分发,您的文件/目录必须包含(并链接):
README.txt
MANIFEST.in
LICENSE.txt
使用分发就绪应用程序
由于我们已经完成了应用程序的创建,然后对文件结构进行了必要的修改,为完美的分发构建做好准备,我们可以从打包操作开始。
如何创建分发文件
为了生成分发文件副本,请运行以下命令:
cd ~/MyApplication python setup.py sdist
此命令将通过您的设置,打印出正在执行的操作并在新创建的 dist
目录中生成一个 tar 存档,类似于:
# root@hostname:~/MyApplication# ls dist # MyApplication-0.1.0.tar.gz
注意: 由于我们没有填充所有子文件夹(即 静态)并使用其他文件(例如 README.txt
),您可能会在创建过程中看到一些警告。
如何安装应用程序
从现在开始,您的应用程序可以通过创建的 setup.py
文件被其他人安装和使用。
为了安装应用程序,运行以下命令:
python setup.py install
如果此安装用于开发并且还需要安装要求,请运行以下命令:
python setup.py develop
如何共享您的应用程序
如果您想在 Python Packaging Index 上共享您的代码,您可以按照以下方式启动“注册”过程:
python setup.py register
您需要按照屏幕上的说明完成该过程。
如果您有注册登录,为了只上传,您可以使用以下内容:
python setup.py sdist upload
如何创建应用程序新版本的包
- 使用文本编辑器编辑
setup.py
文件(例如 nano) 并设置新版本号:version="0.1.1"
- 编辑 CHANGES.txt 以反映更改
- 对 LICENSE.txt 和 README.txt 进行必要的调整
- 按照上一步上传您的代码。