我想从调用脚本时指定的简单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()
这样的事情可能吗?
答案 0 :(得分:2)
嗯,有几种方法可以做到这一点。最简单的方法是使用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 ”对象,但它仍然不太安全。例如,该文件可能能够定义一个函数,该函数将使用恶意代码覆盖您的某个类的函数。所以我真的不推荐它,除非你绝对控制.py文件。
更安全但更复杂的方法是创建一个解释此文件但不允许运行任何自定义代码的自定义解释器。
您可以阅读以下主题,以查看解析库的一些建议或eval()
的其他更安全的替代方案:
Python: make eval safe
此外,如果你需要你的config.py文件是以一种很好的方式初始化一些变量,并且你不需要能够从里面调用花哨的python函数,你应该考虑使用JSON代替。 Python 2.6及更高版本包含simplejson,您可以使用它来从文件初始化对象。语法是Javascript而不是Python,但是对于初始化变量,那里没什么区别。
答案 1 :(得分:0)
你能试试self.__dict__.update(configFile.__dict__)
吗?我不明白为什么那不起作用。