4

好的,我想创建一个包含 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,但这并不是我真正想要的(除非我错过了由它产生的 tarball 不能安装 pip 的东西)。

为了完成,我的 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',
    ],
) 

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

4

1 回答 1

0

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

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

此外,您的项目似乎丢失了mylibrary/__init__.py

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

在下面的示例中,我gevent-1.0b2-py2.7-macosx-10.4-x86_64.egg使用它的setup.py bdist_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/目录是构建的鸡蛋文件所在的位置,何时setup.py bdist_egg调用。

于 2012-08-08T00:21:12.493 回答