如何测试一个Python模块是否已被导入?

45 投票
3 回答
41535 浏览
提问于 2025-04-16 11:59

如何测试一个模块在Python中是否被导入了?

比如我需要一些基础知识:

if not has_imported("sys"):
   import sys

还有

if not has_imported("sys.path"): 
   from sys import path

谢谢!

祝好。

感谢大家的评论:这里粘贴了代码。

自动导入文件夹中的所有子模块,然后调用同名函数 - Python运行时检查相关

3 个回答

8
from sys import modules
try:
    module = modules[module_name]
except KeyError:
    __import__('m')   

这是我在运行时修改代码的解决方案!

15

我觉得被接受的答案并不完全正确。

在Python中,当你多次导入同一个模块时,还是会有一些额外的开销。虽然Python会处理这些情况而不会报错,但这并不意味着你的程序就不会变慢。从下面的链接可以看到,多次导入一个模块会带来明显的开销

举个例子,如果你在某种情况下才需要某个模块,而这个模块又很大或者开销很高,那么最好是根据条件来导入它。这并不意味着你就是个马虎的程序员。

https://wiki.python.org/moin/PythonSpeed/PerformanceTips#Import_Statement_Overhead

51

如果你想通过避免重复导入来优化代码,其实没必要费这个心思,因为Python自己已经处理好了这个问题。

如果你真的需要这样做来避免出现NameErrors之类的错误,那就要好好检查你的代码了——确保在使用任何东西之前都已经定义(导入)好,也就是说,导入的内容应该在程序启动时一次性导入,或者在模块的最上面导入。

如果你有正当理由需要这样做:sys.modules是一个字典,里面包含了所有已经被导入的模块。但它只包含模块,而且由于from <module> import <variable>的工作方式(先导入整个模块,然后提取你需要的部分),from sys import path只会把sys添加到sys.modules中(前提是它在启动时还没有被导入)。而from pkg import module则会像你预期的那样,把pkg.module添加进去。

撰写回答