2010-06-18 39 views
8

中的配置文件我有一個具有以下結構的Python項目:問題訪問一個Python蛋

package1 
    class.py 
    class2.py 
    ... 
package2 
    otherClass.py 
    otherClass2.py 
    ... 
config 
    dev_settings.ini 
    prod_settings.ini 

我寫這個轉換爲具有相同的文件結構一個雞蛋setup.py文件。 (當我使用zip程序檢查它的結構看起來是相同的。)有趣的是,當我從我的IDE運行Python代碼時,它工作正常,可以訪問配置文件;但是當我嘗試從使用egg的不同Python腳本運行它時,似乎無法在egg中找到配置文件。如果我將配置文件放到一個相對於的目錄中,並且調用 Python腳本(在蛋的外部),它就可以工作 - 但這種做法會使得擁有一個包含程序所有功能的自包含蛋的目的失敗可以從任何地方調用。只要他們不使用配置文件,我可以使用任何類/模塊並運行egg中的任何函數......但是如果他們這樣做了,egg就找不到它們,所以函數不起作用。

任何幫助將非常感謝!我們對這裏的雞蛋很感興趣,並不知道從哪裏開始。

回答

11

問題是,配置文件不再是文件 - 它們被打包在蛋中。在文檔中找到答案並不容易,但它在那裏。從setuptools developer's guide

Typically, existing programs manipulate a package's __file__ attribute in order to find the location of data files. However, this manipulation isn't compatible with PEP 302-based import hooks, including importing from zip files and Python Eggs.

要訪問它們,你需要按照instructions的資源管理API。

在我自己的代碼中,我有一個日誌配置文件的問題。我這樣成功地使用了API:

from pkg_resources import resource_stream 

_log_config_file = 'logging.conf' 
_log_config_location = resource_stream(__name__, _log_config_file) 
logging.config.fileConfig(_log_config_location) 
_log = logging.getLogger('package.module') 
+0

我很困惑......我可能會有點慢,因爲這些概念對我來說是新的,所以請耐心等待。我必須更改我的Python類中使用配置文件的代碼來使用pkg_resources模塊,而不是對其進行硬編碼?我現在加載配置文件的行是'config = ConfigParser.RawConfigParser()config.read(「.. \\ config \\」+ environment +「_settings.ini」)'...我應該改變這個至? – froadie 2010-06-18 16:39:24

+0

@froadie:這是正確的。你需要像'config.read(resource_stream(__ name__, 「.. \\ \\配置」 +環境+ 「_settings.ini」)'此外,您還需要導入資源管理模塊:'從pkg_resources才能導入resource_stream' – 2010-06-18 16:49:35

+0

我想類似的東西 - 'config.read(pkg_resources.resource_filename(__ name__, 「.. \\ \\配置」 +環境+ 「_settings.ini」))'(resource_filename而不是resource_stream因爲讀取文件名) - 它運作時,我運行它,但我仍然得到一個錯誤,當試圖從蛋中調用它,雖然這是一個新的 - 'KeyError:'myPackageName \\ .. \\ config \\ dev_settings.ini'' – froadie 2010-06-18 16:56:35