2011-09-26 44 views
1

輸入Python數據在一個shell腳本,人們可能會做這樣的事情:蟒蛇:簡單的方法來從文件

myvar='default_value' 
source myfile.sh 
echo $myvar 

其中myfile.sh是一樣的東西:

echo "myvar='special_value'" > myfile.sh 

我知道有幾家「安全「在python中這樣做的方式,但我能想到的在Python中獲得類似行爲的唯一方式(雖然很醜並且不安全)如下:

myvar = 'default_value' 
myimport = 'from %s import *' % 'myfile' 
exec(myimport) 
print(myvar) 

,其中myfile.py是./,看起來像:

myvar = 'special_value' 

我想我會是最幸福的做這樣的事情:

m.myvar = 'default_value' 
m.update(__import__(myimport)) 

,並有以m更新的對象。我想不出一個簡單的方法來做到這一點,而不寫一些東西來循環對象。

+0

出了什麼問題只是'進口myfile'然後'MYVAR = myfile.myvar'或'從MYFILE進口myvar'?你需要解釋你的用例以及爲什麼不起作用。 – agf

回答

4

有兩種方法可以查看此問題。

我怎樣才能讀取蟒蛇鍵值對?有沒有一個標準的方法來做到這一點?

我怎樣才能充分表達能力的配置腳本?

如果你的問題是第一個;那麼最明顯的答案就是使用ConfigParser模塊:

from ConfigParser import RawConfigParser 
parser = RawConfigParser({"myvar": "default_value"}) # Never use ConfigParser.ConfigParser! 
parser.read("my_config") 
myvar = parser.get("mysection", "myvar") 

這將讀取,看起來像一個正常的INI風格的配置文件中的值:

# You can use comments 
[mysection] 
myvar = special_value 

對於第二個選項,當你真想給蟒蛇的全功率配置(這是罕見的,但有時是必要的),你可能不希望使用import,而應該使用execfile

config = {} 
execfile("my_config", config) 
myvar = config.get("myvar", "default_value") 

反過來,它將從python腳本讀取;它會讀取全局變量myvar不管如何腳本派生它:

import random 
myvar = random.choice("special_value", "another_value")