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

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站

简介


所有使用包管理器(例如 pip)下载的 Python 库(即应用程序包)都是使用专门执行此任务的实用程序进行分发的。这些实用程序创建"Python 分发",基本上是版本化(和压缩的)存档。所有与所分发内容相关的元素,例如源文件和资源文件,都包含在其中。

在这篇 DigitalOcean 文章中,我们将讨论分发所需的工具,并介绍关键步骤,以便您能够打包自己有用的库、模块或应用程序,这将有助于您在 droplet 上部署项目或在互联网上共享。

Python 分发和包


即使您只是稍微使用过 Python,您也会熟悉使用包管理器(例如 pip、easy_install)下载模块和库(例如应用程序开发框架),然后导入并用于创建新的模块。

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

分发应用程序的方式包括使用一些必备文件(以及一些推荐的文件)包装其目录,指定相关元素(例如资源、依赖项等),然后发布或在其他地方使用它...就是这么简单。

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

Python 包


在 Python 中,包[技术上]是一个可导入的目录(带有 __init__.py),其中包含源文件(即模块)。这不应与操作系统包混淆,后者[技术上]是实际应用程序(即 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 flask 应用程序[结构]开始,然后我们可以用它来打包。

创建应用程序结构


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

示例结构:

/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

放入以下内容:

# 运行测试服务器。
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 文件:

bash 复制代码
nano ~/MyApplication/app/__init__.py

将以下内容粘贴进去:

python 复制代码
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 文件:

bash 复制代码
nano app/module_one/controllers.py

将以下内容粘贴进去:

python 复制代码
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 文件:

bash 复制代码
nano app/templates/module_one/hello.html

将以下内容粘贴进去:

html 复制代码
<pre>
    &lt!DOCTYPE html>
    &lthtml lang="en">
    &lthead>
        &lttitle>{% block title %}My Site{% endblock %}</title>
        {% block css %}
        {% endblock %}
        &ltmeta name="viewport" content="width=device-width, initial-scale=1.0">
      &lt/head>
    &ltbody>
    Hello, world!
    &lt/body>
    &lt/html>
</pre>

按下 CTRL+X 保存并退出,确认选择 Y

开始应用程序分发/打包


在创建了一个使用 Flask 的网站的示例应用程序结构之后,我们可以继续迈出准备分发的第一步。

修改文件夹结构


为了很好地打包我们的应用程序,我们需要对文件夹结构进行一些添加。

bash 复制代码
/MyApplication
    |-- run.py
    |__ /app
         |-- __init__.py
         |-- /module_one
             |-- __init__.py
             |-- controllers.py
             |-- models.py                
         |__ /templates
             |-- module_one
                 |-- hello.html
         |__ /static
         |__ ..
         |__ .
    |-- setup.py    # 分发设置文件
    |-- README.txt  # 读我文件
    |-- MANIFEST.in # 分发清单文件
    |-- CHANGES.txt # 变更日志

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

bash 复制代码
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


bash 复制代码
nano ~/MyApplication/setup.py

将以下内容粘贴进去:

python 复制代码
from distutils.core import setup

setup(
    # 应用程序名称:
    name="MyApplication",
    
    # 版本号(初始):
    version="0.1.0",
    
    # 应用程序作者详细信息:
    author="name surname",
    author_email="name@addr.ess",
    
    # 包
    packages=["app"],
    
    # 将额外文件包含到包中
    include_package_data=True,
    
    # 详细信息
    url="http://pypi.python.org/pypi/MyApplication_v010/",
    
    #
    # license="LICENSE.txt",
    description="Useful towel-related stuff.",
    
    # long_description=open("README.txt").read(),
    
    # 依赖包(分发)
    install_requires=[
        "flask",
    ],
)

按下 CTRL+X 保存并退出,确认选择 Y

创建 MANIFEST.in


如果需要包含额外的目录(例如 static 或 templates),需要在 清单 中明确声明它们以进行打包。我们将在 MANIFEST.in 中执行此操作。

bash 复制代码
nano ~/MyApplication/MANIFEST.in

将以下内容粘贴进去:

bash 复制代码
recursive-include app/templates *
recursive-include app/static *

按下 CTRL+X 保存并退出,确认选择 Y

这就是全部!您的 Python 分发包已准备好安装和分发。

附加文件


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

  • README.txt

  • MANIFEST.in

  • LICENSE.txt

使用分发就绪的应用程序


在完成了应用程序的创建并对文件结构进行必要的修改以准备进行无缝分发构建之后,我们可以开始进行打包操作。

如何创建分发文件


为了生成分发文件副本,请运行以下命令:

bash 复制代码
cd     ~/MyApplication
python setup.py sdist

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

bash 复制代码
# root@hostname:~/MyApplication# ls dist
# MyApplication-0.1.0.tar.gz

注意: 由于我们没有填充所有子文件夹(例如 static)并且使用了额外文件(例如 README.txt),在创建过程中可能会看到一些警告。

如何安装应用程序


从现在开始,你的应用程序可以通过创建的 setup.py 文件进行安装和使用。

要安装应用程序,请运行以下命令:

bash 复制代码
python setup.py install

如果这个安装是为了开发目的,并且还需要安装依赖项,运行以下命令:

bash 复制代码
python setup.py develop

如何分享你的应用程序


如果你想在 Python 包索引上分享你的代码,可以按照以下步骤进行"注册":

bash 复制代码
python setup.py register

你需要按照屏幕上的指示完成该过程。

如果你已经注册登录,只需上传代码,可以使用以下命令:

bash 复制代码
python setup.py sdist upload

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


  1. 使用文本编辑器(例如 nano)编辑 setup.py 文件,并设置新的版本号:version="0.1.1"

  2. 编辑 CHANGES.txt 以反映更改

  3. 对 LICENSE.txt 和 README.txt 进行必要的调整

  4. 按照上一步骤上传你的代码。

相关推荐
阿万音玲羽2 小时前
李沐《动手学深度学习》kaggle树叶分类(ResNet18无预训练)python代码实现
人工智能·python·深度学习·机器学习·分类·cnn
yava_free2 小时前
详解一下JVM诊断方法和其工具的使用
java·开发语言
MATLAB滤波3 小时前
MATLAB中的绘图技巧
开发语言·matlab
赵孝正4 小时前
如何在jupyter notebook切换python环境
ide·python·jupyter
致宏Rex4 小时前
Rust 入门指南(零):安装及 Cargo 管理器
开发语言·rust
伏虎山真人4 小时前
R门 - rust第一课陈天 -内存知识学习笔记
开发语言·r语言
好开心334 小时前
javaScript交互补充(元素的三大系列)
开发语言·前端·javascript·ecmascript
Z2116133474 小时前
学习日志011--模块,迭代器与生成器,正则表达式
python
CrazyCosin4 小时前
Clip结合Faiss+Flask简易版文搜图服务
python·flask·faiss