【问题标题】:How to `from x import *` when x is a string当x是字符串时如何`from x import *`
【发布时间】: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


【解决方案1】:

这听起来是个糟糕的主意,但这里有一个加载math 模块并使用它的一些功能的示例。

import importlib

my_module = importlib.import_module('math')    
globals().update(my_module.__dict__)

print(globals())
print(sin(pi/2))

jmd_dk 的代码改进)


这听起来是个坏主意,因为from x import * 将导入一切 并可能覆盖本地属性。

此外,很可能还有更清晰的方法可以通过使用字典来实现您的目标。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 2017-09-18
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    相关资源
    最近更新 更多