• 打包您的代码
    • 打包的多种方式
    • 对于Python开发者
      • Pip vs. easy_install
      • 私人的PyPI
        • pypiserver
        • S3-Hosted PyPi
    • 在Linux上分发
      • 有用的工具

    打包您的代码

    https://farm5.staticflickr.com/4325/36137234682_be6898bf57_k_d.jpg
    打包就是把您的代码分享给其他开发者。作为例子,共享一个库给其他开发者用在它们的应用中,或者作为一个开发工具,比如 'py.test'。

    这种分发方式的一个优势是它拥有既已建成的良好的工具生态,如PyPI与pip,其使得其他开发者很容易下载与安装您的包,而无论是一个即兴实验还是作为一个巨型软件系统的一部分。

    使用这种方式共享Python代码是既已存在的传统,如果您的代码没打包到PyPI上,则它将难以被其他开发者找到并用在它们的程序中。事实上他们会怀疑这种项目是否管理不善或者已被放弃了。

    像这样分发代码的消极一面是它依赖使用者理解如何安装所要求的Python版本以及会并且希望使用pip这样的工具安装您的代码及其他依赖项。虽然对于其它的开发者来说这是没问题的,但对于最终用户这并不友好。

    Python打包指南提供了更多关于如何创建以及维护Python包的知识。

    打包的多种方式

    为了分发应用给最终用户,您应该冻结您的应用。

    在Linux,您可能想会考虑创建一个Linux分发包(例 对于Debian或Ubuntu是一个 .deb文件)

    对于Python开发者

    如果您编写了一个开源的Python模块, PyPI, 更多属性参见 The Cheeseshop,这是一个放它的地方。

    Pip vs. easy_install

    Use pip. More detailshere

    使用 pip. 更多细节参见here

    私人的PyPI

    如果您想要从有别于PyPI的其他源安装包(也就是说,如果您的包是 专门 (proprietary)的),您可以通过为自己开启一个服务器来建立一个这样的源,这个服务器应该开在您想共享的包所在位置的文件夹下。

    例子总是有益的

    作为例子,如果您想要共享一个叫做 MyPackage.tar.gz 的包,并且假设您的文件结构是这样的:

    • archive
      • MyPackage
        • MyPackage.tar.gz
          打开您的命令行并且输入:
    1. $ cd archive
    2. $ python -m SimpleHTTPServer 9000

    这运行了一个简单的http服务器,其监听端口9000并且将列出所有包(比如 MyPackage)。现在您可以使用任何Python包安装器从您的服务器中安装 MyPackage 。若使用Pip,您可以这样做:

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

    您的文件夹名字与您的包名相同是 必须 的。我曾经被这个坑过一次。但是如果您觉得创建一个叫做 MyPackage 的文件夹然后里面又有一个 MyPackage.tar.gz 文件是 多余 的,您可以这样共享 MyPackage:

    1. $ 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/
    1. 上传新文件* 使用像Cyberduck这些的客户端同步整个 packages`文件夹到您的s3 bucket
    • 保证您像(注意文件和路径)这样 :code:`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文件,这将使用户极其厌烦。不仅如此,您会要维持每个发布版的使用指导,也许更糟的是,您的用户要去读,理解,并按它上面说的做。

    下面是指导如何做上面所说事情的链接:

    • Fedora
    • Debian and Ubuntu
    • Arch

    有用的工具

    • fpm
    • alien
    • dh-virtualenv (for APT/DEB omnibus packaging)

    原文: http://pythonguidecn.readthedocs.io/zh/latest/shipping/packaging.html