整个想法是从文件中读取变量,其中也包含导入:
的规则:
1)文件是不可触及的(我们可以阅读,但没有修改)
2)我们不想从文件导入中导入变量(只有文件中的变量)
3)我们没有创建临时文件(假设没有写访问权)
我的想法有两个步骤:
1)(完成),将文件读取到内存并注释所有导入行
2)使用imp导入值
2a)将文件内容映射回文件类型
2b)use imp.load_source()
2c){key: value for key, value in foo.__dict__.iteritems() if not key.startswith('_')}
坚持2a
,任何人都可以帮助/支持我吗?
示例文件:
# from os import *
myvar = 'aaa'
答案 0 :(得分:1)
如果我已正确理解您的要求,通常 evil eval
可以在此处提供帮助。通常不赞成,因为执行任意代码是不安全的,但不比加载任意脚本更不安全。
因此,假设您能够读取文件并对所有导入语句进行注释和注释,并且您将结果脚本放在字符串script_str
中,您可以这样做:
glob = {} # or glob = globals() if you want current globals to be accessible
loc = {}
exec(script_str, glob, loc)
vars = { key:loc[key] for key in loc if not key.startswith('_') }
问题是从脚本中注释某些行可能会导致脚本不正确或导致错误的结果。例如:
from os import SEEK_END
how = SEEK_END
它应该导致{ "how": 2 }
。很遗憾,如果没有对导入进行评论,您将获得{'SEEK_END': 2, 'how': 2}
,但在评论之后,exec
调用将引发异常NameError: name 'SEEK_END' is not defined
。
我的意见是,为最常见的情况修复它会很难......