介绍
使用软件包管理器(例如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烧录器应用程序[结构],然后我们可以使用它来打包。
创建应用程序结构
我们的目标是创建一个类似于大多数真实世界项目的例子。 因此,最好是想象一个具有模块化组件的场景。
示例结构:
/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
。
编辑app / 初始化的.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
放置内容:
<!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确认。
从应用程序分发/包装开始
已经创建了使用瓶的网站的示例性应用结构,我们可以继续采取第一步骤准备分配。
更改文件夹结构
为了很好地打包我们的应用程序,我们需要对我们的文件夹结构做一些补充。
/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.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
此命令将通过你的设置,打印出所执行的操作,并生成新创建的内部tar归档diet
目录,类似于:
# 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上共享您的代码,可以按照以下方式启动“register”过程:
python setup.py register
您需要按照屏幕上的说明完成此过程。
如果您有注册的登录,为了只是上传,您可以使用以下:
python setup.py sdist upload
如何创建应用程序的新版本的包
编辑
setup.py
使用文本编辑器(如纳米)文件,并设置新的版本号:version="0.1.1"
编辑CHANGES.txt以反映更改
对LICENSE.txt和README.txt进行必要的调整
按照上一步骤上传代码。