2011-05-05 32 views
26

在setup.py,我指定package_data這樣的:如何從源代碼使用package_data中的數據?

packages=['hermes'], 
package_dir={'hermes': 'hermes'}, 
package_data={'hermes': ['templates/*.tpl']}, 

而且我的目錄結構大致

hermes/ 
| 
| docs/ 
| ... 
| hermes/ 
    | 
    | __init__.py 
    | code.py 
    | templates 
     | 
     | python.tpl 
| 
| README 
| setup.py 

的問題是,我需要在我的源代碼,從模板目錄中使用的文件代碼,所以我可以寫出python代碼(這個項目是一個解析器生成器)。我似乎無法弄清楚如何正確包含和使用我的代碼中的這些文件。有任何想法嗎?

回答

33

標準pkgutil module's get_data() function將計算路徑到您的數據,相對於你的包,並通過任何模塊加載Python中導入hermes包檢索數據爲您提供:

import pkgutil 
data = pkgutil.get_data('hermes', 'templates/python.tpl') 

當然在某些情況下您可以使用從hermes.__file__計算的路徑讀取數據,但是如果您打算分發項目,請考慮它可能以不同方式安裝在最終用戶的計算機上:作爲普通文件,部署在壓縮的蛋檔案中等。在後一種情況下,您的hermes模塊將由Python使用zipimporter導入,從而阻止y OU從做一個正常open(path).read()

>>> import hermes 
>>> hermes.__loader__ 
<zipimporter object "/home/pat/.cascade/virt/foo/lib/python2.6/site-packages/foo-0.0.0-py2.6.egg"> 

如果您能夠接受的distribute代碼庫增加一個運行時依賴,你可能想consdider看pkg_resources module,它可以給你同樣的結果,但增加了其他功能。

import pkg_resources 
data = pkg_resources.resource_string('hermes', 'templates/python.tpl') 
+4

一個可以直接使用'__name__'而不是指定的模塊名稱,因此'數據= pkg_resources.resource_string( 'Hermes的', '模板/ python.tpl')''變爲數據= pkg_resources.resource_string(__ name__,'模板/ python.tpl')' – b1r3k 2014-09-17 09:40:06

相關問題