如何打包和发布 Python 应用程序

介绍


您使用包管理器(例如Pip)下载的所有Python库(即应用程序包)都通过专门执行任务的实用程序进行分发,这些实用程序创建了Python分布,这些实用程序基本上是版本(和压缩)的档案。

在这篇DigitalOcean文章中,我们将讨论分发所需的工具,并讨论关键步骤,使您能够包装自己的有用的库,模块或应用程序 - 这些工具应该在部署您的项目时或在互联网上共享时为您提供帮助。

Python 发行版和包


即使你只使用了Python,你也会熟悉使用包管理器(例如,pip,easy_install)来下载模块和库(例如,应用程序开发框架)的概念,然后被导入并使用来创建一个新的。

这些本地操作的包管理工具连接到源(即Python Package Index - PyPI)并执行所需的操作(例如搜索和安装),因为它们运行这些资源,而这些资源实际上被称为Python分布。

部署应用程序的方法是将其目录包装成一些必备文件(以及一些推荐的文件),指定相关元素(例如资源,依赖等),并将其释放或在其他地方使用。

** 注意:** 强烈鼓励您使用虚拟环境来隔离您正在使用的 Python 下载、模块和应用程序。

Python 软件包


在Python中,一个包(技术上)是一个可导入的目录(包含__init__.py)包含源文件(即模块)。这不应该与操作系统包混淆,这些包(技术上)是实际的应用程序(即 Debian 包)。

包装结构示例:

1package
2  |
3  |-- __init__.py

Python 应用程序


虽然从单个文件到数百个分散在各种 packages 中的任何东西都可以被认为是 Python 中的应用程序,但在最现实的场景中,应用程序将由多个模块和一定数量的外部导入(从库)组成。

应用结构示例:

 1myapp
 2  |
 3  |-- __init__.py
 4  |-- amodule.py
 5  |-- anothermod.py
 6  |__ tests
 7  |     |
 8  |     |-- __init__.py
 9  |     |-- ..
10  |     |-- .
11  | ..

Python 分布工具和库


鉴于Python的流行性质和大量的第三方库 / 应用程序为其编写,一种更简单和统一的分布方式一直是必不可少的。

为了处理分布任务,创建了Python分布工具集 distutils

Python 包指数(PyPI)


Python Package Index,或PyPI,是项目(Python分布)的中央(在线)存储库。Pip 等包管理工具使用此存储库来托管、查找和安装它们。

开始的


让我们从创建一个简单的,一般的Python泡沫应用程序(结构)开始,然后我们可以使用它来包装。

构建应用结构


我们的目标是创建一个类似于大多数现实世界的项目的示例,因此,最好想象一个具有模块化的组件的场景。

结构示例:

 1/MyApplication
 2    |-- run.py
 3    |-- config.py
 4    |__ /app
 5         |-- __init__.py
 6         |-- /module_one
 7             |-- __init__.py
 8             |-- controllers.py
 9             |-- models.py                
10         |__ /templates
11             |-- module_one
12                 |-- hello.html
13         |__ /static
14         |__ ..
15         |__ .

创建文件夹:


 1mkdir ~/MyApplication
 2cd    ~/MyApplication
 3touch run.py
 4touch config.py
 5mkdir app
 6cd app
 7touch __init__.py
 8mkdir templates
 9mkdir static
10mkdir module_one
11cd module_one
12touch __init__.py
13touch controllers.py
14touch models.py
15cd    ../templates
16mkdir module_one
17cd module_one
18touch hello.html

使用 nano 编辑 run.py:


1nano ~/MyApplication/run.py

放置内容:

1# Run a test server.
2from app import app
3app.run(debug=True)

使用 CTRL + X 保存和退出,并用 Y 确认。

使用 nano 编辑 config.py:


1nano ~/MyApplication/config.py

放置内容:

1DEBUG = True
2
3THREADS_PER_PAGE = 4
4
5CSRF_ENABLED     = True
6CSRF_SESSION_KEY = "secret"

使用CTRL+X保存和退出,并用Y确认。

使用 nano 编辑 app/init.py:


1nano ~/MyApplication/app/__init__.py

放置内容:

1from flask import Flask, render_template
2
3app = Flask(__name__)
4app.config.from_object("config")
5
6from app.module_one.controllers import module_one
7
8app.register_blueprint(module_one)

使用 CTRL + X 保存和退出,并用 Y 确认。

使用 nano 编辑 app/module_one/controllers.py:


1nano app/module_one/controllers.py

放置内容:

1from flask import Blueprint, request, render_template
2
3module_one = Blueprint("auth", __name__, url_prefix="/auth")
4
5@module_one.route("/hello")
6def hello():
7    return render_template("module_one/hello.html")

使用CTRL+X保存和退出,并用Y确认。

放置内容:

使用 nano 编辑 app/templates/module_one/hello.html:


1nano app/templates/module_one/hello.html

放置内容:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <title>{% block title %}My Site{% endblock %}
        {% block css %}
        {% endblock %}
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
      </head>
    <body>
    Hello, world!
    </body>
    </html>

使用 CTRL + X 保存和退出,并用 Y 确认。

从应用程序分发 / 包装开始


创建了一个使用Flash的网站的示范性应用结构后,我们可以继续准备发行第一步。

更改文件夹结构


为了将我们的应用程序包装得很好,我们需要对我们的文件夹结构做一些补充。

 1/MyApplication
 2    |-- run.py
 3    |__ /app
 4         |-- __init__.py
 5         |-- /module_one
 6             |-- __init__.py
 7             |-- controllers.py
 8             |-- models.py                
 9         |__ /templates
10             |-- module_one
11                 |-- hello.html
12         |__ /static
13         |__ ..
14         |__ .
15    |-- setup.py    # Distribution setup file
16    |-- README.txt  # Read-me file
17    |-- MANIFEST.in # Distribution manifest file
18    |-- CHANGES.txt # Changes log

更改文件夹结构以创建必要的文件:

1touch ~/MyApplication/setup.py
2touch ~/MyApplication/README.py
3touch ~/MyApplication/MANIFEST.py
4touch ~/MyApplication/CHANGES.py
5mv    ~/MyApplication/run.py ~/MyApplication/bin/run

创建 setup.py


1nano ~/MyApplication/setup.py

下面列出自我解释的内容:

 1from distutils.core import setup
 2
 3setup(
 4    # Application name:
 5    name="MyApplication",
 6
 7    # Version number (initial):
 8    version="0.1.0",
 9
10    # Application author details:
11    author="name surname",
12    author_email="[email protected]",
13
14    # Packages
15    packages=["app"],
16
17    # Include additional files into the package
18    include_package_data=True,
19
20    # Details
21    url="http://pypi.python.org/pypi/MyApplication_v010/",
22
23    #
24    # license="LICENSE.txt",
25    description="Useful towel-related stuff.",
26
27    # long_description=open("README.txt").read(),
28
29    # Dependent packages (distributions)
30    install_requires=[
31        "flask",
32    ],
33)

使用 CTRL + X 保存和退出,并用 Y 确认。

创建Manifest.in


如果您需要发送额外的目录(例如静态或模板),您需要在将其包装的 manifest 中明确说明它们。

1nano ~/MyApplication/MANIFEST.in

下面列出自我解释的内容:

1recursive-include app/templates *
2recursive-include app/static *

使用 CTRL + X 保存和退出,并用 Y 确认。

你的Python发行包已经准备好安装和发货。

附加檔案


请记住,为了有一个完整的分布,您的文件 / 目录必须包含(和链接):

*「README.txt」 *「MANIFEST.in」 *「LICENSE.txt」

与配送准备的应用程序合作


由于我们已经完成了我们的应用程序的创建,然后对文件结构进行了必要的更改,以便为无缺陷的分布构建做好准备,我们可以开始通过包装操作。

如何创建分布文件


若要生成分发文件副本,请执行以下操作:

1cd     ~/MyApplication
2python setup.py sdist

此命令将通过您的设置,打印所执行的操作,并在新创建的dist目录中生成一个tar 档案,类似于:

1# root@hostname:~/MyApplication# ls dist
2# MyApplication-0.1.0.tar.gz

** 注意:由于我们没有填充所有子文件夹(即静态)并与其他文件(例如README.txt)合作,您可能会在创建过程中看到一些警告。

如何安装应用程序


从现在开始,你的应用程序可以被其他人安装并使用创建的 setup.py 文件。

要安装应用程序,请运行以下操作:

1python setup.py install

如果此安装是要开发的,并且还需要安装要求,请执行以下操作:

1python setup.py develop

如何分享您的应用程序


如果您想在 Python 包装索引上共享您的代码,您可以通过按照以下方式启动注册程序来做到这一点:

1python setup.py register

您需要按照屏幕上的指示完成程序。

如果您有注册登录,为了仅仅上传,您可以使用以下方式:

1python setup.py sdist upload

如何创建应用程序的新版本的包


  1. 使用文本编辑器编辑 setup.py 文件(例如 nano)并设置新的版本号码: version="0.1.1"
  2. 编辑 CHANGES.txt 以反映变更
  3. 对 LICENSE.txt 和 README.txt 4 进行必要的调整。
Submitted by: O.S. Tezer
Published At
Categories with 技术
comments powered by Disqus