2011-05-29 55 views
1

我想通過編寫一些帶有變量賦值和函數的Python代碼來保存複雜的配置,這些代碼和函數稍後將由ConfigReader類導入。配置知道文件名的python腳本

基本上到目前爲止,我已經寫了我的配置文件:

a=1 

這就像

c=ConfigReader("C:\my_file") 
print(c.a) 

對於我使用EXEC()的一類,但現在我也想了配置文件知道它自己的文件名(因爲該目錄提供了一些變量的信息)

所以我需要一個配置文件,如:

a=parse_project_number_from_dir(__file__) 

看來我需要在Python 3來代替EXEC()被一些小鬼模塊加載?這是執行一個簡單文件使其意識到其路徑的最簡單方法嗎?

此外,我想我的ConfigReader類讀取所有變量到字典。 (有了exec,我只看了當地人())。我現在應該做什麼,不能在配置文件中導入輔助導入(如parse_project_number_from_dir函數),而只是我在那裏實際定義的內容(即a =)?

+1

你真正想要解決的問題?爲什麼不把文件作爲模塊導入? – Achim 2011-05-29 20:15:15

+0

我想導入一個配置文件,該文件可以是硬盤上帶有Python代碼的任何文件。我想要頂級變量是可訪問的。顯然,文件所在的目錄名可能包含我需要在配置文件中處理的一些信息。 – Gerenuk 2011-05-29 21:49:01

回答

2

當您使用Python腳本exec時,沒有文件名,因爲您正在給exec一個字符串或編譯對象。 exec命令無法知道您獲得此字符串的位置。

但有分享與要傳遞到exec config文件中的知識的一種方式。例如...

比方說,你有一個配置文件,上面寫着

print myname 

然後運行下面的Python腳本:

ns = {} 
ns["myname"] = "sample.cfg" 
s = open("sample.cfg","r") 
exec s in ns # in 3.x use exec(s,ns) instead 

這將創建一個新的命名空間,該命名空間中創建一個名爲myname的變量。由於腳本知道它即將打開的文件的名稱,因此可以將其分配給一個變量。效果與exec 'myname = "sample.cfg"' in ns相同。

然後,當你執行的是配置文件,你告訴它使用ns命名空間分享你的腳本的知識。如果這看起來有點令人困惑,請閱讀globalslocals以及命名空間。

+0

這似乎是一個解決方案。但是我想知道爲什麼我找不到exec用大括號或文檔中的「in」語句?! – Gerenuk 2011-05-30 08:29:26

+0

'exec'正式是一個像'def'或'class'這樣的Python語句,因此您需要在正確的位置查找。我認爲在'eval()'函數的文檔中有一個參考。大括號只是製作一個空的'dict',這就是命名空間的存儲方式。 – 2011-05-31 01:21:31

+0

我只找到exec *函數*,因爲它只接受一個字符串,所以它是不同的。 http://docs.python.org/py3k/library/functions.html#eval – Gerenuk 2011-05-31 15:56:00

0
import sys 
sys.path.insert(0,"path to your file") 
from yourFile import *