介绍
您使用包管理器(例如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
如何创建应用程序的新版本的包
- 使用文本编辑器编辑
setup.py
文件(例如 nano)并设置新的版本号码:version="0.1.1"
- 编辑 CHANGES.txt 以反映变更
- 对 LICENSE.txt 和 README.txt 4 进行必要的调整。