How to `from x import *` when x is a string
我正在制作一个程序,在这个程序中,用户可以保存一个文件,将其加载回去,并按照他们想要的方式命名该文件。
如何动态导入该模块的所有属性?
例如下面的伪代码:
1 2
| 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标识符而不是关键字),并为本地和全局发送您自己的dict。
- @Emanuellandeholm无法确保输入安全。
- @费米悖论可能是真的。这就是我要做的:github.com/elandeholm/pimp/blob/master/pimp.py这对于我自己的使用来说已经足够安全了,但我不会这样发送代码。
- @Emanuellandeholm offtic:试图在链接的rep中查找缺陷,但以前从未使用argv或bash。但令人惊讶的是,我可以命名一个文件print('arbitrary code can be run');file_1.py。也许发布该代码并寻求滥用方法会成为一个有趣的问题。"eval-型问题有时会流行。
- eval/exec总是适合滥用。我发现了一种从一个在线python repl(将保持匿名)中偷偷调用eval()的方法,给作者发了邮件,他回到我身边,基本上说"没有切实可行的方法来阻止eval"。他们失败的态度令我目瞪口呆。当然,他们的repl是以其他方式加强的(monkeypatching,过滤的导入),但我很肯定,在这个repl中有一种方法可以用eval()做坏事。
这听起来是一个糟糕的想法,但这里有一个加载math模块并使用其某些功能的示例。
1 2 3 4 5 6 7
| import importlib
my_module = importlib.import_module('math')
globals().update(my_module.__dict__)
print(globals())
print(sin(pi/2)) |
(code improvements by jmd_dk)
这听起来是个坏主意,因为from x import *将导入所有内容,并可能覆盖本地属性。
此外,使用字典很可能有更清晰的方法来实现您的目标。