2014-09-24 57 views
11

我想發佈一個整體的virtualenv,或一束精確的版本,其運行時依賴的Python的車輪,例如:包括在Python輪運行時依賴

  • pycurl
    • pycurl 。所以
      • libcurl.so
        • libz.so
        • libssl.so
        • libcrypto.so
        • libgssapi_krb5.so
          • libkrb5.so
            • libresolv.so

我想我可以依靠系統來安裝libssl.so,但肯定不是libcurl.so的正確版本,可能不是Kerberos。

將所有運行時間依賴關係中的一個庫打包到一個輪子中的最簡單方法是什麼?或者是一個傻瓜的差事,我應該打包整個virtualenv? 如何可靠地做到這一點?

P.S.在飛行編譯不是一種選擇,一些模塊被修補。

回答

9

AFAIK,沒有好的標準方法可以在您的軟件包中可移植地安裝依賴項。 Continuum有made conda for precisely this purpose。 numpy的人在他們的軟件包中編寫了自己的distutils子模塊來安裝一些複雜的依賴關係,現在at least some of them advocate conda as a solution。不幸的是,您可能必須自己爲這些依賴關係生成conda包。

如果你沒有良好的可移植性,那麼針對目標機器的包管理器顯然會工作。否則,對於便攜式包管理器而言,conda是我所知道的唯一選擇。

或者,從您的帖子(「即時編譯不是一個選項」),它聽起來像可移植性可能不是你的問題,在這種情況下,你也可以將所有需求安裝到前綴目錄我遇到的大多數安裝人員都支持configure --prefix=/some/dir/選項)。如果你有一個有保證的單一體系結構,你可能會前綴 - 將所有的依賴關係安裝到一個目錄中,並像文件一樣傳遞。 Conda的方法可能會更乾淨,但我已經使用前綴安裝很多,他們往往是最簡單的解決方案之一。

編輯: 至於conda,它同時是一個軟件包管理器和一個「virtualenv」環境/ python安裝。當virtualenv被添加到現有的python安裝之上時,conda會接管整個安裝,所以你可以更確定所有的依賴關係都被解決了。與pip相比,它旨在添加通用的非Python依賴項,而不是僅編譯C/Cpp exentions。欲瞭解更多信息,我會看到:

至於如何使用暢達你的目的,the docs解釋如何創建配方:

康達建設框架

建立一個包需要一個配方。配方是平的目錄當中 包含以下文件:

  • meta.yaml(元數據文件)
  • 這是使用CMD執行
  • bld.bat(使用Windows構建腳本build.sh(這是使用bash執行Unix編譯腳本) )
  • run_test.py(可選的Python測試文件)
  • 補丁到源(可選,見下文)
  • ö這些資源不包括在源中,並且不能由構建腳本生成的 。

應該使用相同的配方在所有平臺上構建一個包。

當建立一個包,下面的步驟被調用:

  1. 讀取元數據
  2. 下載源(到高速緩存)
  3. 源目錄提取源
  4. 應用修補程序
  5. 創建構建環境(此處安裝構建依賴關係)
  6. 運行實際的構建腳本。當前工作目錄是設置了環境變量的源 目錄。構建腳本安裝到 構建環境中
  7. 做一些必要的後處理步驟:shebang,rpath等
  8. 附加暢達元數據來構建環境
  9. 包起來構建環境中的新文件到康達包裝
  10. 測試新康達包裝:
    • 創建測試環境與包(其依賴關係)
    • 運行測試腳本

conda-recipes <https://github.com/continuumio/conda-recipes>_回購中有許多conda包的示例食譜。

The:ref:conda skeleton <skeleton_ref> command可以幫助製作常見的 存儲庫的骨架配方,如PyPI <https://pypi.python.org/pypi> _。

然後,作爲一個客戶,你將安裝包similar to how you would install from pip

最後,docker也可以是有趣的你,雖然我還沒有看到它大量使用Python的。