2012-08-07 27 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