我想从文件中读取一组变量定义。我想使用execfile
来阅读它们(以简化我的输入代码)。考虑:
#! /usr/bin/python
from math import *
import os
cmd="""
a=[0,3]
b=[0,1]
print 'Hello'
print sin(2)
os.system('rm my_important_file')
"""
gd={}
ld={}
exec(cmd,gd,ld)
print ld
(我在这里使用exec
代替execfile
来简化问题)。如您所见,我试图通过提供字典作为第二和第三个参数来安全地使用exec
。我想只将变量定义作为输入文件中的有效操作。因此print 'Hello'
,print sin(2)
和os.system('rm my_important_file')
都会产生错误。它似乎适用于最后两个,但不适用于print 'Hello'
。这是什么原因?
答案 0 :(得分:2)
print
是一种语句,一种语言功能。执行它不需要导入。使用exec
或execfile
时,您正在执行所有有效的Python代码,其中包含print
语句。
您的空字典也不会阻止进口。我仍然可以这样做:
import os
os.system('rm my_important_file')
在配置文件中,并在此文件上调用execfile()
的Python代码的权限下执行。
如果您的配置文件仅允许使用作业和表达式子集,请勿使用execfile
或exec
。没有办法让那些安全的&#39 ;; Python太过动态了。
将文件解析为域特定语言,或使用其他预先存在的配置文件格式,例如ConfigParser
。但是,这些不允许执行Python表达式。