【问题标题】:Prohibiting import in Python using import statement在 Python 中使用 import 语句禁止导入
【发布时间】:2018-02-09 23:29:36
【问题描述】:

我想限制 Python 3 中某些模块的导入(但对于这个问题的范围,假设我想限制任何导入)。这就是我正在尝试的方式:

def __import__(self, *args, **kwrgs):
    raise ImportError("Imports are not allowed")

import math

print math.sqrt(4)

据我了解,这应该引发异常,并且它基于该文档 - https://docs.python.org/3/reference/import.html#importsystem

import 语句的搜索操作被定义为调用 __import__() 函数,并带有适当的参数。

但是,事实并非如此。我将非常感谢您解释为什么以及如何实现我的目标的建议

【问题讨论】:

  • import module 调用内置函数__import__('module'),而不是module.__import__()

标签: python python-3.x python-import


【解决方案1】:

语句import module_name 调用带有参数'module_name' 的内置函数__import__。它没有,事实上也不能像你预期的那样调用module_name.__import__(),因为模块本身还没有被加载。

实现您想要的一个好方法是检查不可导入模块中的__name__ 全局变量。当它运行时,它应该等于'__main__',但是当它被导入时,它会是从它的名字构造的一些其他字符串。因此,您可以尝试:

if __name__ != '__main__':
    raise ImportError("Imports are not allowed")

【讨论】:

  • 如果我想限制内置模块的导入,那将不起作用
  • 你是对的。您应该将此要求添加到您的问题中:)
【解决方案2】:

您有一个误解:文档不建议在模块中定义您自己的 __import__ 函数。他们想说的是,当您有类似的导入语句时

import mymodule

那么这里解析名称mymodule的方式是通过这种方式调用the built-in function __import__

__import__('mymodule')

如果你想阻止一个模块被成功导入,你可以把任何语法错误放在那里,例如将此作为文件中的第一行:

# my_unimportable_file.py
error error error

【讨论】:

  • 啊,谢谢。编写 _builtins_.__import__ = my_custom_function 做了我想要的
  • 你的最后一个建议不是很有帮助:你不能这样做来阻止人们导入内置模块。
  • 告诉我一种防止导入​​内置模块的方法,我会告诉你一个解决方法。
  • 考虑接受您的挑战。 _builtins_.__import__ = import_rewrite; _import_ = import_rewrite;这样你不能使用 import 命令导入,_import_ 函数也不能 import importlib 告诉我绕过它的方法,那真的很有帮助
  • 我将只使用来自().__class__.__base__.__subclasses__() 的加载器类之一并使用它。那里总是有一堆,因为它们是在解释器启动时创建和使用的。
猜你喜欢
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
相关资源
最近更新 更多