打包您的代码¶

打包代码以与其他开发人员共享。例如,共享一个库,供其他开发人员在其应用程序中使用,或用于“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与简易安装¶
个人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存储桶。
从Pypi或其他源安装所有需求
安装PIP2PI
pip install git+https://github.com/wolever/pip2pi.git
对于pip2tgz和dir2pi命令,请遵循pip2pi自述文件
pip2tgz packages/ YourPackage
(或)pip2tgz packages/ -r requirements.txt
)dir2pi packages/
上传新文件
使用像Cyberduck这样的客户端同步整个
packages
文件夹到你的S3桶。确保上传
packages/simple/index.html
以及所有新文件和目录。
修复新文件权限
默认情况下,当您将新文件上载到S3存储桶时,它们将具有错误的权限设置。
使用Amazon Web控制台将文件的读取权限设置为“所有人”。
如果在尝试安装包时获得HTTP 403,请确保正确设置了权限。
全部完成
您现在可以使用
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文件之前的命令会带来非常恶劣的用户体验。不仅如此,您还必须为每个发行版维护与这些指令相同的自定义内容,更糟的是,让您的用户阅读、理解和执行这些内容。
说了这么多,下面是怎么做的:
有用的工具¶
dh-virtualenv (适用于APT/DEB综合包装)