打包您的代码

../_images/36137234682_be6898bf57_k_d.jpg

打包代码以与其他开发人员共享。例如,共享一个库,供其他开发人员在其应用程序中使用,或用于“py.test”等开发工具。

这种分发方法的一个优点是它有着良好的工具生态系统,如pypi和pip,这使得其他开发人员可以方便地下载和安装您的包,无论是用于临时实验,还是作为大型专业系统的一部分。

以这种方式共享Python代码是一种成熟的约定。如果您的代码没有打包在Pypi上,那么其他开发人员将很难找到它并将其作为现有流程的一部分使用。他们将对这些项目有很大的怀疑,即管理不善或被放弃。

像这样分发代码的缺点在于,它依赖于接收者了解如何安装所需的Python版本,并且能够并且愿意使用PIP等工具来安装代码的其他依赖项。这在分发给其他开发人员时很好,但使这种方法不适合将应用程序分发给最终用户。

这个 Python Packaging Guide 提供有关创建和维护Python包的广泛指南。

包装替代品

要将应用程序分发给最终用户,您应该 freeze your application .

在Linux上,您可能还需要考虑 creating a Linux distro package (例如Debian或Ubuntu的.deb文件。)

对于Python开发人员

如果您正在编写一个开源的python模块, PyPI ,更确切地说是 奶酪店 是它的举办地。

PIP与简易安装

使用 pip .更多详细信息 here .

个人PYPI

如果要从Pypi以外的源安装软件包(例如,如果您的软件包是 专有的 ,您可以通过托管一个简单的HTTP服务器来完成此操作,该服务器从保存需要安装的包的目录中运行。

举个例子总是有益的

例如,如果要安装名为 MyPackage.tar.gz ,假设这是您的目录结构:

  • 档案文件
    • MyPackage
      • MyPackage.tar.gz

转到命令提示并键入:

$ cd archive
$ python -m http.server 9000

这将运行在端口9000上运行的简单HTTP服务器,并将列出所有包(如 MyPackage )。现在可以安装 MyPackage 使用任何python包安装程序。使用pip,您可以这样做:

$ pip install --extra-index-url=http://127.0.0.1:9000/ MyPackage

具有与包名称相同的文件夹是 关键的 在这里。有一次我被那个愚弄了。但是如果你觉得创建一个名为 MyPackage 和保持 MyPackage.tar.gz 里面是 冗余 ,您仍然可以使用以下方法安装mypackage:

$ pip install  http://127.0.0.1:9000/MyPackage.tar.gz

Pypis服务器

pypiserver 是最小的PYPI兼容服务器。它可以用来提供一组软件包,以便于安装或PIP。它包括一些有用的功能,如管理命令 (-U )它将把所有的包更新到PYPI上的最新版本。

S3托管的PYPI

个人PYPI服务器的一个简单选择是使用AmazonS3。先决条件是您有一个Amazon AWS帐户和一个S3存储桶。

  1. 从Pypi或其他源安装所有需求

  2. 安装PIP2PI

  • pip install git+https://github.com/wolever/pip2pi.git

  1. 对于pip2tgz和dir2pi命令,请遵循pip2pi自述文件

  • pip2tgz packages/ YourPackage (或) pip2tgz packages/ -r requirements.txt

  • dir2pi packages/

  1. 上传新文件

  • 使用像Cyberduck这样的客户端同步整个 packages 文件夹到你的S3桶。

  • 确保上传 packages/simple/index.html 以及所有新文件和目录。

  1. 修复新文件权限

  • 默认情况下,当您将新文件上载到S3存储桶时,它们将具有错误的权限设置。

  • 使用Amazon Web控制台将文件的读取权限设置为“所有人”。

  • 如果在尝试安装包时获得HTTP 403,请确保正确设置了权限。

  1. 全部完成

  • 您现在可以使用 pip install --index-url=http://your-s3-bucket/packages/simple/ YourPackage .

对于Linux发行版

创建Linux发行版包可以说是在Linux上分发代码的“正确方法”。

因为发行包不包含python解释器,所以它使下载和安装的大小比 freezing your application .

另外,如果发行版为python发布了新的安全更新,那么您的应用程序将自动开始使用该新版本的python。

bdist_rpm命令使 producing an RPM file 对于像RedHat或Suse这样的发行版来说,使用起来非常简单。

但是,创建和维护每个发行版格式所需的不同配置(例如,debian/ubuntu的deb、Red Hat/Fedora的rpm等)是相当多的工作。如果您的代码是计划在其他平台上分发的应用程序,那么您还必须创建和维护冻结Windows和OS X应用程序所需的单独配置。只为其中一个跨平台的应用程序创建和维护一个配置要少得多。t窗体 freezing tools 它将为Linux的所有发行版以及Windows和OS X生成独立的可执行文件。

如果您的代码是针对当前不受分发支持的Python版本的,那么创建分发包也是有问题的。不得不说 一些版本 需要添加的Ubuntu最终用户数 the 'dead-snakes' PPA 使用 sudo apt-repository 在安装.deb文件之前的命令会带来非常恶劣的用户体验。不仅如此,您还必须为每个发行版维护与这些指令相同的自定义内容,更糟的是,让您的用户阅读、理解和执行这些内容。

说了这么多,下面是怎么做的:

有用的工具