2011-11-15 20 views
3

我正在寫一個使用PIP &的virtualenv來管理其開發環境Django應用程序。如何在Python中分發/訪問數據文件?

之一依賴性,pkgme,附帶了許多的數據文件,其是它的「後端」和在其setup.py配置有data_files=$FOO(而不是package_data)。

當pkgme​​查找其後端,它看起來在os.path.join(sys.prefix, "share", "pkgme", "backends")。當pkgme​​已經正常安裝這個偉大的工程,而且似乎符合documentation但並沒有工作時pkgme​​安裝爲一個雞蛋。

在那裏,數據文件$VIRTUAL_ENV/lib/python2.7/site-packages/pkgme-0.1-py2.7.egg/share而不是預期的$VIRTUAL_ENV/share下安裝。

這給我留下了兩個問題:

  1. 我應該使用比上述os.path.join以外的東西找到數據文件無論我們使用的是雞蛋安裝或傳統的系統安裝?如果是這樣,什麼?
  2. 我應該發佈我的數據文件不同,使他們在一個雞蛋更容易獲得?

請注意,我知道pkgutil.get_data,但寧願不使用它。我不感興趣的內容這些數據文件的,我想知道他們的位置代替,這樣我就可以執行它們。

我目前的計劃是要做到這一點:

  • 使用package_data而不是data_files
  • 變化pkgme​​尋找相對後端到pkgme.__file__而非sys.prefix

回答

1

最後我做了以下內容:

  • 更改pkgme​​使用pkg_resources.resource_filename()找到了自己的包括後端
  • 增加了一個入口點即用Python編寫的任何後端可以用它來發布它自己的位置後臺腳本
  • 不停的sys.prefix基於檢查對於不想使用Python

的差異可以FO任何後端und here:http://bazaar.launchpad.net/~pkgme-committers/pkgme/trunk/revision/86

1

您目前的方案基本上是正確的,或者無論如何是可行的選擇。

當setuptools創建一個蛋時,它會檢查蛋中的代碼是否使用__file__,如果是這樣,它會將蛋標記爲不能以壓縮形式安裝。這樣,當easy_install安裝egg時,它將被解壓縮到.egg/目錄,而不是留在.egg文件中。

如果你想支持壓縮/ Drop-in安裝(即只是傾倒在一個目錄下的雞蛋沒有「安裝」的話),那麼你應該使用pkg_resources.resource_filename()(docs here) API,而不是__file__,但隨後你的包會依賴於setuptools或分發,以使該API可用。

+0

謝謝PJE。很高興知道'__file__'檢查。我採用了類似於我在問題中提出的方法,但是額外使用了入口點來處理一些後端。 – jml

相關問題