我想从调用脚本时指定的简单
python文件中存储的数据初始化一个类.名为myconfig.py的配置文件是:
str='home'
val=2
flt=7.0
我想在课堂启动时这样称呼它.其中一个目标是在文件中定义变量类型.我知道configparser,但是这个方法如果可以工作则不那么冗长.
class ClassInit(object):
def __init__(self, configFile):
fp, path, des = imp.find_module('',configFile)
imp.load_module(configFile, fp, path, des)
self.__dict__ = configFile.__dict__
fp.close()
def printVal(self):
print '%s %0.2f'%(self.str, self.val)
if __name__ == '__main__':
srcDir = 'src/'
config = osp.join(srcDir, argv[0]) # config for current run
ci = ClassInit(config)
ci.printVal()
有可能这样吗?
最佳答案 嗯,有几种方法可以做到这一点.最简单的方法是使用eval()或exec在类范围内评估此代码.但这也是最危险的方式,特别是如果这些文件可以由你以外的人创建.在这种情况下,创建者可以编写几乎可以执行任何操作的恶意代码.你可以覆盖全局字典的__builtins__键,但我不确定这是否使eval / exec完全安全.例如:
class ClassInit(object):
def __init__(self, configFile):
f = open(configFile)
config = f.read()
f.close()
config_dic = { '__builtins__': None}
exec 'a = 4' in config_dic
for key, value in config_dic.iteritems():
if key != '__builtins__':
setattr(self, key, value)
这种方法杀死了不安全的’builtins’对象,但它仍然不太安全.例如,该文件可能能够定义一个函数,该函数将使用恶意代码覆盖您的某个类的函数.所以我真的不推荐它,除非你绝对控制thos .py文件.
更安全但更复杂的方法是创建一个解释此文件但不允许运行任何自定义代码的自定义解释器.
您可以阅读以下主题,以查看解析库的一些建议或eval()的其他更安全的替代方法:
Python: make eval safe
此外,如果你需要你的config.py文件是以一种很好的方式初始化一些变量,并且你不需要能够从里面调用花哨的python函数,你应该考虑使用JSON. Python 2.6及更高版本包含simplejson,您可以使用它来从文件初始化对象.语法是Javascript而不是Python,但是对于初始化变量,那里的差别不大.