前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
简介
所有使用包管理器(例如 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 ~/MyApplicationcd ~/MyApplicationtouch run.pytouch config.pymkdir appcd apptouch __init__.pymkdir templatesmkdir staticmkdir module_onecd module_onetouch __init__.pytouch controllers.pytouch models.pycd ../templatesmkdir module_onecd module_onetouch hello.html
使用 nano 编辑 run.py:
nano ~/MyApplication/run.py
放入以下内容:
# 运行测试服务器。from app import appapp.run(debug=True)
使用 CTRL+X
保存并退出,然后确认选择 Y
。
使用 nano 编辑 config.py:
nano ~/MyApplication/config.py
放入以下内容:
DEBUG = TrueTHREADS_PER_PAGE = 4CSRF_ENABLED = TrueCSRF_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> <!DOCTYPE html> <html lang="en"> <head> <title>{% block title %}My Site{% endblock %}</title> {% block css %} {% endblock %} <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> Hello, world! </body> </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.pytouch ~/MyApplication/README.pytouch ~/MyApplication/MANIFEST.pytouch ~/MyApplication/CHANGES.pymv ~/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 ~/MyApplicationpython 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
如何创建应用程序新版本的软件包
使用文本编辑器(例如 nano)编辑 setup.py
文件,并设置新的版本号:version="0.1.1"
编辑 CHANGES.txt 以反映更改
对 LICENSE.txt 和 README.txt 进行必要的调整
按照上一步骤上传你的代码。