如何打包和分发 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 = TrueTHREADS_PER_PAGE = 4CSRF_ENABLED     = True
CSRF_SESSION_KEY = "secret"

使用 CTRL+X 保存并退出,然后确认选择 Y

使用 nano 编辑 app/init.py 文件:

nano ~/MyApplication/app/__init__.py

将以下内容粘贴进去:

from flask import Flask, render_templateapp = Flask(__name__)
app.config.from_object("config")from app.module_one.controllers import module_oneapp.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_templatemodule_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

将以下内容粘贴进去:

<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 的网站的示例应用程序结构之后,我们可以继续迈出准备分发的第一步。

修改文件夹结构


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

/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 # 变更日志

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

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 setupsetup(# 应用程序名称: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 中执行此操作。

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

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

如何安装应用程序


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

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

python setup.py install

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

python setup.py develop

如何分享你的应用程序


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

python setup.py register

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

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

python setup.py sdist upload

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


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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/56043.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rootless模式下istio ambient鉴权策略

环境说明 rootless模式下测试istio Ambient功能 四层鉴权策略 这里四层指的是网络通信模型的第四层&#xff0c;主要的传输协议为TCP和UDP。 用于限制服务间的通信&#xff0c;比如下面的策略应用于带有 app: productpage 标签的 Pod&#xff0c; 并且仅允许来自服务帐户 clus…

js动态生成二维码

html&#xff1a; <script type"text/javascript" src"js/qrcode.min.js"></script>&#xff08;资源里可下载&#xff09; <div class"tan_ma" style"width:100%; height:100%; position:fixed; left:0; top:0; backgrou…

云计算第四阶段: cloud二周目 07-08

cloud 07 一、k8s服务管理 创建服务 # 资源清单文件 [rootmaster ~]# kubectl create service clusterip websvc --tcp80:80 --dry-runclient -o yaml [rootmaster ~]# vim websvc.yaml --- kind: Service apiVersion: v1 metadata:name: websvc spec:type: ClusterIPselector…

速盾:免费cdn加速节点是什么?

免费CDN加速节点是指一种提供免费的内容分发网络&#xff08;CDN&#xff09;服务的网络节点。CDN是一种通过将网站的静态内容分布到全球各个节点上&#xff0c;从而加快网站访问速度的技术。免费CDN加速节点是免费提供这种服务的节点&#xff0c;在全球范围内分布着许多这样的…

ChatTTS在Windows电脑的本地部署与远程生成音频详细实战指南

文章目录 前言1. 下载运行ChatTTS模型2. 安装Cpolar工具3. 实现公网访问4. 配置ChatTTS固定公网地址 前言 本篇文章主要介绍如何快速地在Windows系统电脑中本地部署ChatTTS开源文本转语音项目&#xff0c;并且我们还可以结合Cpolar内网穿透工具创建公网地址&#xff0c;随时随…

面试头棒-Java如何判断两个对象是否相等

在Java中&#xff0c;判断两个对象是否相等通常涉及两个层面的比较&#xff1a;引用相等&#xff08;也称为身份相等&#xff09;和内容相等&#xff08;也称为值相等&#xff09;。 引用相等&#xff08;Identity Equality&#xff09;&#xff1a; 使用 运算符。如果两个引…

react里实现左右拉伸实战

封装组件&#xff1a; 我自己写的一个简单的组件&#xff0c;可能有bug。不想自己写&#xff0c;建议用第三方库实现。 新建一个resizeBox.tsx文件写上代码如下&#xff1a; import React, { ReactNode, useState, useEffect, useRef } from react; import styles from &quo…

【中危】Oracle TNS Listener SID 可以被猜测

一、漏洞详情 Oracle 打补丁后&#xff0c;复测出一处中危漏洞&#xff1a;Oracle TNS Listener SID 可以被猜测。 可以通过暴力猜测的方法探测出Oracle TNS Listener SID&#xff0c;探测出的SID可以用于进一步探测Oracle 数据库的口令。 建议解决办法&#xff1a; 1. 不应该使…

大数据治理的关键技术:构建稳固的数据基石

在这个信息爆炸的时代&#xff0c;数据已经成为企业最宝贵的资产之一。然而&#xff0c;随着数据量的爆炸性增长&#xff0c;如何有效治理这些数据成为了一个巨大的挑战。今天&#xff0c;我们就来聊聊大数据治理的关键技术&#xff0c;看看如何构建一个稳固的数据基石&#xf…

【某农业大学计算机网络实验报告】实验四 路由信息协议RIP

实验目的&#xff1a; 1&#xff0e;深入了解RIP协议的特点和配置方法&#xff1a;通过此次实验&#xff0c;掌握RIP协议作为一种动态路由协议的基本工作原理&#xff0c;了解其距离向量算法的核心概念&#xff0c;以及如何在网络设备上配置RIP协议&#xff1b; 2.验证RIP协议…

基于微信小程序的电影交流平台

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

【Next.js 项目实战系列】02-创建 Issue

原文链接 CSDN 的排版/样式可能有问题&#xff0c;去我的博客查看原文系列吧&#xff0c;觉得有用的话&#xff0c;给我的库点个star&#xff0c;关注一下吧 上一篇【Next.js 项目实战系列】01-创建项目 创建 Issue 配置 MySQL 与 Prisma​ 在数据库中可以找到相关内容&…

Java项目-基于Springboot的招生管理系统项目(源码+说明).zip

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

智联云采 SRM2.0 testService SQL注入漏洞复现

0x01 产品简介 智联云采是一款针对企业供应链管理难题及智能化转型升级需求而设计的解决方案,针对企业供应链管理难题,及智能化转型升级需求,智联云采依托人工智能、物联网、大数据、云等技术,通过软硬件系统化方案,帮助企业实现供应商关系管理和采购线上化、移动化、智能…

求助,宠物空气净化器该怎么选?双十一有什么推荐购买的吗?

今晚就要付双十一尾款了&#xff0c;拖延症晚期的我还没做什么功课。本来不打算消费的&#xff0c;看了眼购物车&#xff0c;之前想买的宠物空气净化器降价了不少&#xff0c;不想错失这次优惠。 我家猫孩子之前不怎么掉毛的&#xff0c;连日常的梳毛我都经常偷懒&#xff0c;…

WordPress+Nginx 安装教程

WordPress 是一个开源的网站建设工具&#xff0c;可以用它来“快速”搭建个人博客&#xff0c;官网等等。它本身是用 php 开发的&#xff0c;本身部署不复杂&#xff0c;主要是需要一些配套的东西才能跑起来&#xff0c;网上的一些教程也是写的不清不楚&#xff0c;本文针对非 …

Centos7安装ZLMediaKit

https://github.com/ZLMediaKit/ZLMediaKit 一 获取代码 git clone https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit git submodule update --init git submodule update --init 命令用于初始化和更新 Git 仓库中的子模块&#xff08;submodules&#xff09;。这个命令…

安全生产玩手机检测系统 玩手机识别系统 玩手机监测预警系统 使用 Python 和 OpenCV 库实现

在生产作业过程中&#xff0c;员工玩手机是一种极其危险的行为。它会分散员工的注意力&#xff0c;使其无法专注于工作任务。生产现场往往存在各种潜在的危险因素&#xff0c;如机械设备的运转、高空作业、化学品的使用等&#xff0c;一旦员工分心&#xff0c;就很容易忽视这些…

跨浏览器免费书签管理系统

随着互联网信息的爆炸式增长&#xff0c;如何有效管理我们日常浏览中发现的重要网页&#xff0c;成为了每个重度互联网用户的需求。一个跨平台的书签管理网站能够帮助用户在不同设备之间无缝同步和管理书签。本文将分享如何使用 Python 和 SQLite 构建一个简单、易于维护的跨平…

暖水毯/取暖毯语音识别控制芯片IC方案

暖水毯、取暖毯作为现代家居生活的温暖伴侣&#xff0c;其智能化升级已是大势所趋。在暖水毯与取暖毯中融入语音识别控制芯片IC方案&#xff0c;为用户的冬日取暖体验带来了革命性的变革。 一、暖水毯/取暖毯增加语音识别控制芯片方案&#xff0c;让产品能通过对话来调节&…