2012-08-07 83 views
4

好的,我想创建一个预先构建的包含C模块的Python包。也就是说,在它结束时,我想有一个包含用我的模块所需要的一切,是PIP安装-能,即在最后,我可以做一个压缩包:OSX上的预构建Python包

pip install whatevertarballgetsproduced.tar.gz 

,并在MyLibrary将可。它还需要虚拟环境友好。

我现在的目录结构:

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', 
    ], 
) 

注意,我不上公开发布此压缩包计划,它仅用于内部部署的目的(所以为什么我不不关心它被预编译,或仅与OSX绑定)。

回答

0

亚当,你试过setup.py bdist_egg

它会产生一个可以使用easy_install安装的蛋文件(不幸的是,与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/目录是内置鸡蛋文件去,当调用setup.py bdist_egg

+0

忘了包含'__init __。py',谢谢指出。为了回答你的问题:我确实尝试过制作鸡蛋,但正如你所提到的那样.egg与Pip无关,这对我来说是一个关键要求。 – 2012-08-08 16:57:16

+0

当您使用Pip安装软件包时,您的目标是Python虚拟环境还是直接安装到全球站点软件包中?在前一种情况下,您的Pip要求可能没有实际意义,因为现代'virtualenv'捆绑了pip和easy_install,这些工具可以很好地互操作。所以如果pip缺少一个功能,可以使用easy_install,如图所示。 – 2012-08-08 20:49:21

+0

实际上,在某些情况下,我需要定位全局站点包,而在其他情况下,我将使用虚拟环境。我还有一些其他的依赖项,这些依赖项在pip需求文件中指定,因此,不必为该项目混合使用'easy_install'和'pip'进行包管理。 – 2012-08-09 16:15:28