如何测试一个Python模块是否已被导入?
如何测试一个模块在Python中是否被导入了?
比如我需要一些基础知识:
if not has_imported("sys"):
import sys
还有
if not has_imported("sys.path"):
from sys import path
谢谢!
祝好。
感谢大家的评论:这里粘贴了代码。
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
添加进去。