如何打包和分发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

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


  1. 使用文本编辑器编辑 setup.py 文件(例如 nano) 并设置新版本号:version="0.1.1"
  2. 编辑 CHANGES.txt 以反映更改
  3. 对 LICENSE.txt 和 README.txt 进行必要的调整
  4. 按照上一步上传您的代码。

提交人: [[“%3Ca|https]] ://twitter.com/ostezer [[“%3C/a|”>操作系统]] 泰泽