使用 import 语句禁止在 Python 中导入

Prohibiting import in Python using import statement

我想限制 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

The search operation of the import statement is defined as a call to the __import__() function, with the appropriate arguments.

然而,事实并非如此。我将不胜感激关于原因的解释和如何实现我的目标的建议

您误会了:文档并未建议在模块中定义您自己的 __import__ 函数。他们想说的是,当你有一个像

这样的导入语句时
import mymodule

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

__import__('mymodule')

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

# my_unimportable_file.py
error error error

语句import module_name调用内置函数__import__,参数'module_name'。它没有,事实上不能,如您所料调用 module_name.__import__(),因为模块本身还没有被加载。

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

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