【发布时间】:2016-11-25 03:25:30
【问题描述】:
我正在制作一个程序,用户可以在其中保存文件,将其加载回来,并以他们想要的方式命名文件。
如何动态导入该模块的所有属性?
例如类似于下面的伪代码:
module_name = input()
from module_name import *
假设module_name 以“.py”结尾。
我正在使用 python 3.5。
【问题讨论】:
-
听起来你在找
__import__:stackoverflow.com/questions/13598035/… -
exec('import {}'.format(the_input)) -- 快速而肮脏但不是很安全,除非你过滤'the_input'(例如,通过确保它是一个有效的python标识符和不是关键字)并为本地和全局发送您自己的字典。
-
@EmanuelLandeholm 没有办法保证输入安全。
-
@Fermi 悖论 可能是真的。这就是我所做的:github.com/elandeholm/pimp/blob/master/pimp.py 我自己使用它足够安全,但我不会发布这样的代码。
-
eval/exec 总是很容易被滥用。我找到了一种从在线 python REPL(将保持未命名)中调用 eval() 的偷偷摸摸的方法,给作者发了邮件,他回复了我,基本上说“没有实际的方法可以防止 eval”。他们的失败主义态度让我目瞪口呆。当然,他们的 REPL 在其他方面得到了强化(猴子补丁、过滤导入),但我很肯定在那个 REPL 中有一种方法可以用 eval() 做坏事。
标签: python python-3.x