打包您的代码
打包就是把您的代码分享给其他开发者。作为例子,共享一个库给其他开发者用在它们的应用中,或者作为一个开发工具,比如 'py.test'。
这种分发方式的一个优势是它拥有既已建成的良好的工具生态,如PyPI与pip,其使得其他开发者很容易下载与安装您的包,而无论是一个即兴实验还是作为一个巨型软件系统的一部分。
使用这种方式共享Python代码是既已存在的传统,如果您的代码没打包到PyPI上,则它将难以被其他开发者找到并用在它们的程序中。事实上他们会怀疑这种项目是否管理不善或者已被放弃了。
像这样分发代码的消极一面是它依赖使用者理解如何安装所要求的Python版本以及会并且希望使用pip这样的工具安装您的代码及其他依赖项。虽然对于其它的开发者来说这是没问题的,但对于最终用户这并不友好。
Python打包指南提供了更多关于如何创建以及维护Python包的知识。
打包的多种方式
为了分发应用给最终用户,您应该冻结您的应用。
在Linux,您可能想会考虑创建一个Linux分发包(例 对于Debian或Ubuntu是一个 .deb文件)
对于Python开发者
如果您编写了一个开源的Python模块, PyPI, 更多属性参见 The Cheeseshop,这是一个放它的地方。
Pip vs. easy_install
私人的PyPI
如果您想要从有别于PyPI的其他源安装包(也就是说,如果您的包是 专门 (proprietary)的),您可以通过为自己开启一个服务器来建立一个这样的源,这个服务器应该开在您想共享的包所在位置的文件夹下。
例子总是有益的
作为例子,如果您想要共享一个叫做 MyPackage.tar.gz
的包,并且假设您的文件结构是这样的:
- archive
- MyPackage
- MyPackage.tar.gz
打开您的命令行并且输入:
- MyPackage.tar.gz
- MyPackage
- $ cd archive
- $ python -m SimpleHTTPServer 9000
这运行了一个简单的http服务器,其监听端口9000并且将列出所有包(比如 MyPackage)。现在您可以使用任何Python包安装器从您的服务器中安装 MyPackage 。若使用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
pypiserver
Pypiserver 是一个精简的PyPI兼容服务器。它可以被用来让一系列包通过easy_install与pip进行共享。它包含一些有益的命令,诸如管理命令( -U
),其可以自动更新所有它的包到PyPI上的最新版。
S3-Hosted PyPi
一个简单的个人PyPI服务器实现选项是使用Amazon S3。使用它的一个前置要求是您有一个Amazon AWS账号并且有 S3 bucket。
- 安装所有您需要的东西从PyPI或者其他源
- 安装 pip2pi
- pip install git+https://github.com/wolever/pip2pi.git
- 跟着 pip2pi 的README文件使用pip2tgz 与 dir2pi命令
- pip2tgz packages/ YourPackage (or pip2tgz packages/ -r requirements.txt)
- dir2pi packages/
- 上传新文件* 使用像Cyberduck这些的客户端同步整个
packages`文件夹到您的s3 bucket
保证您像(注意文件和路径)这样 `packages/simple/index.html
上传了新的文件。
- Fix新文件许可
- 默认情况下,当您上传新文件到S3 bucket,它们将有一个不合适的许可设置。
- 使用Amazon web console设置文件的对所有人的READ许可。
- 如果当您尝试安装一个包的时候遇上 HTTP 403 ,确保您正确设置了许可。
- 搞定
- 您可以安装您的包通过使用代码 pip install —index-url=http://your-s3-bucket/packages/simple/ YourPackage
在Linux上分发
创建一个Linux分发包对于Linux来说是个正确的决定。
因为分发包可以不包含Python解释器,它使得下载与安装这些包可以减小2MB,freezing your application.
并且,如果Python有了更新的版本,则您的应用可以自动使用新版本的Python。
bdist_rpm命令使得 producing an RPM file使得像Red Hat以及SuSE使用分发包变得极其简单,
无论如何,创建和维持不同配置要求给不同的发布格式(如 对于Debian/Ubuntu是.deb,而对于RedHat/Fedora是.rpm等)无疑需要大量的工作。如果您的代码是一个应用,而您计划分发到其他平台上,则您需要创建并维护各个配置要求来冻结您的应用为Windows与OSX。它比创建和维护一个单独的配置给每个平台要简单的多 freezing tools其将产生独立可执行的文件给所有Linux发布版,就像Windows与OSX上一样,
创建一个对Python版本敏感的分发包也会造成问题。可能需要告诉Ubuntu的 一些版本 的用户他们需要增加 the 'dead-snakes' PPA通过使用 sudo apt-repository 命令在他们安装您的 .deb文件,这将使用户极其厌烦。不仅如此,您会要维持每个发布版的使用指导,也许更糟的是,您的用户要去读,理解,并按它上面说的做。
下面是指导如何做上面所说事情的链接:
有用的工具
- fpm
- alien
- dh-virtualenv (for APT/DEB omnibus packaging)
原文: http://pythonguidecn.readthedocs.io/zh/latest/shipping/packaging.html