【问题标题】:Prebuilt Python package on OSX在 OSX 上预构建的 Python 包
【发布时间】:2012-08-04 22:06:42
【问题描述】:

好的,我想创建一个包含 C 模块的预构建 Python 包。也就是说,最后我想要一个 tarball,其中包含使用我的模块所需的所有内容,并且可以 pip 安装,即最后我可以执行以下操作:

pip install whatevertarballgetsproduced.tar.gz

并且图书馆将可用。它还需要对虚拟环境友好。

我当前的目录结构是:

project/
    + setup.py
    + mylibrary/
        + __init__.py
        + mylibrary.py
        + _mylibrary.so
    + README

即编译后的C库在_mylibrary.so。派生此文件的 C 源代码 包含在 tarball 中。我也在 OSX (Lion) 上这样做。 mylibrary.py 仅包含 C 库代码的 Python 包装器。

我如何实现这一目标?我想过做一个python setup.py bdist,但这并不是我真正想要的(除非我遗漏了一些无法通过 pip 安装的 tarball 的东西)。

为了完成,我的 setup.py 看起来像:

from setuptools import setup

setup(
    name='mylibrary_py3mac',
    version='0.1.1',
    description='My library which is tied to OSX & Python 3',
    long_description=open('README').read(),
    packages=['mylibrary'],
    classifiers = [
        'Intended Audience :: Developers',
        'License :: OSI Approved :: BSD License',
        'Operating System :: MacOS :: MacOS X',
        'Programming Language :: Python :: 3',
    ],
) 

请注意,我不打算公开分发此压缩包,它仅用于内部部署目的(因此我不关心它是否被预编译或仅绑定到 OSX)。

【问题讨论】:

    标签: python macos python-3.x setuptools


    【解决方案1】:

    亚当,你试过setup.py bdist_egg吗?

    它将生成一个可以使用easy_install 安装的egg 文件(不幸的是,不能使用pip)。

    另外,您的项目似乎缺少mylibrary/__init__.py

    添加缺失的“init”文件后,我很想知道setup.py 是否足够聪明,可以将“so”文件包含到生成的 egg 文件中。有可能你必须以某种方式刺激它(我自己没有理由处理“.so”Python 扩展,所以我不知道该怎么做)。

    在以下示例中,我有使用其setup.py bdist_egg 构建的gevent-1.0b2-py2.7-macosx-10.4-x86_64.egg。我已经把它放到了当前目录下的pypi/ 目录下。我知道它恰好有其他依赖项,我也战略性地将它们放入同一个 pypi/ 目录中。

    easy_install --allow-hosts=None \
                 --find-links=pypi/ \
                 --always-unzip \
                 pypi/gevent-1.0b2-py2.7-macosx-10.4-x86_64.egg
    

    您的情况更简单,因为您似乎没有任何额外的依赖项。 所以你会做这样的事情:

    easy_install --always-unzip \
                 dist/mylibrary_py3mac-0.1.1-py2.7-macosx-10.4-x86_64.egg
    

    请注意,dist/ 目录是构建的 Eggs 文件所在的位置,当调用 setup.py bdist_egg 时。

    【讨论】:

    • 忘记包含__init__.py,感谢您指出这一点。回答您的问题:我确实尝试过创建鸡蛋,但正如您提到的,.egg 不适用于 Pip,这对我来说是一个关键要求。
    • 当您使用 Pip 安装包时,您是针对 Python 虚拟环境还是直接安装到全局站点包中?在前一种情况下,您的 Pip 要求可能没有实际意义,因为现代 virtualenv 捆绑了 pip 和 easy_install,并且这些工具可以很好地互操作。因此,如果 pip 缺少某个功能,可以使用 easy_install,如图所示。
    • 实际上,在某些情况下,我需要针对我的全局站点包,而在其他情况下,我将使用虚拟环境。我还有许多在 pip 需求文件中指定的其他依赖项,因此不必将 easy_installpip 混合用于该项目的包管理。
    • 在这种情况下,你现在运气不好,因为pip 还不支持这个功能(看起来)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 2011-09-10
    • 2019-04-01
    • 2012-03-24
    • 1970-01-01
    相关资源
    最近更新 更多