python - 使用 exec 导入特定模块的优点和缺点?

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

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

第一个用例是这样的:

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

这样,除了注入(inject)接口(interface)模块本身的变量 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 *

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

最佳答案

  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 执行任意代码是矫枉过正的(存在潜在的安全漏洞)。

关于python - 使用 exec 导入特定模块的优点和缺点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54645998/

相关文章:

使用 sys.path 和 os.path 问题导入 Python 模块

python - 在 python 中绘制条形图

python - 对元组列表进行排序时的多个要求

解析此字符串的 Pythonic 方式?

python - 找出引发 `ImportError` 时真正出错的地方

python - Python 中的包导入

python - PyTorch |使用数据集 Omniglot 获取 "RuntimeError: Found dtype Long but expected Float"

python - 在 PyOpenGL 中切换 Y 轴和 Z 轴

python-2.7 - 安装pocketsphinx Python时找不到Swig

python-2.7 - 在pika python中设置 'x-message-ttl'