【问题标题】:Pros and cons of using exec for importing a specific module?使用 exec 导入特定模块的优缺点?
【发布时间】:2019-02-12 08:45:59
【问题描述】:

我想了解使用 exec 进行导入的缺点。其中一个文件用作特定功能的实际实现的接口,具体取决于所选项目(框架旨在用于多个项目)。

第一个用例是这样的:

exec ("from API.%s.specific_API_%s import *" % (project, project))

这样,除了注入接口模块本身的变量project 之外,我不需要硬编码任何东西。

这是另一种方式:

if project == 'project_one':
    from API.project_one.specific_API_project_one import *
elif project == 'project_two':
    from API.project_two.specific_API_project_two import *
elif project == 'project_three':
    from API.project_three.specific_API_project_three import *

这样,每次添加新项目以支持时,我都必须更改此接口文件。

【问题讨论】:

  • 第三种可能的方法是使用importlib.import_module,它接受一个字符串参数来进行导入。这可能比使用exec

标签: python python-2.7 python-import python-exec


【解决方案1】:
  1. 如果您需要以编程方式导入模块,请使用importlib 或__import__(针对特定情况)。原因 - 不要重新发明轮子,没有exec 也有办法做你想做的事。如果您的 project 变量来自外部世界,exec 是一个巨大的安全问题。
  2. 通配符导入被认为是不好的做法 - 之后维护代码库变得更加困难。

通过执行任意代码,exec 问题的过度简化示例:

module = 'request'
func = 'urlopen'
exec("from urllib.%s import %s" % (module, func))

func = 'urlopen; print("hello python")'
exec("from urllib.%s import %s" % (module, func))

是的,你的例子更难伪造,但问题仍然存在——当你有完全为你的目的而构建的工具——以编程方式导入模块时,让 python 执行任意代码是多余的(存在潜在的安全漏洞)。

【讨论】:

  • 您能解释一下为什么 exec 是一个巨大的安全问题吗?我试图理解该做什么和不该做什么,而不是按原样排除它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 2019-11-03
  • 1970-01-01
  • 2014-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多