Python 如何防止模块被导入两次?

Python 如何防止模块被导入两次?,python,import,module,Python,Import,Module,在编写python模块时,是否有办法防止客户端代码将其导入两次?就像c/c++头文件一样: #ifndef XXX #define XXX ... #endif 非常感谢 导入被缓存,并且只运行一次。额外的导入只会占用系统中的查找时间。Python模块不会多次导入。仅运行导入两次不会重新加载模块。如果要重新加载,必须使用reload语句。这里有一个演示 foo.py是一个单行模块 print("I am being imported") 这是多次导入尝试的屏幕记录 >>&g

在编写python模块时,是否有办法防止客户端代码将其导入两次?就像c/c++头文件一样:

#ifndef XXX
#define XXX
...
#endif

非常感谢

导入被缓存,并且只运行一次。额外的导入只会占用系统中的查找时间。Python模块不会多次导入。仅运行导入两次不会重新加载模块。如果要重新加载,必须使用
reload
语句。这里有一个演示

foo.py
是一个单行模块

print("I am being imported")
这是多次导入尝试的屏幕记录

   >>> import foo
   Hello, I am being imported
   >>> import foo # Will not print the statement
   >>> reload(foo) # Will print it again
   Hello, I am being imported

正如在其他答案中所指定的,Python在遇到第二条import语句时通常不会重新加载模块。相反,它从
sys.modules
返回其缓存版本,而不执行任何代码

然而,有几个陷阱值得注意:

  • 将主模块作为普通模块导入可以有效地创建同一模块的两个不同名称的实例

    这是因为在程序启动期间。因此,当将其作为普通模块导入时,Python不会在
    sys.modules
    中检测到它并再次导入,而是在第二次导入时使用它的正确名称

    考虑包含以下内容的文件/tmp/a.py:

    # /tmp/a.py
    import sys
    
    print "%s executing as %s, recognized as %s in sys.modules" % (__file__, __name__, sys.modules[__name__])
    import b
    
    另一个文件/tmp/b.py有一个a.py的导入语句(
    import a
    )。
    执行/tmp/a.py将产生以下输出:

    root@machine:/tmp$python a.py
    a、 py执行为_umain__;,在sys.modules中识别为
    /tmp/a.pyc作为执行,在sys.modules中识别为
    
    因此,最好将主模块保持在相当小的范围内,并按照建议将其大部分功能导出到外部模块

  • 指定另外两种可能的方案:

  • 稍有不同的导入语句,在
    sys.path
    中使用不同的条目,导致相同的模块
  • 在前一个模块导入失败后,尝试另一个模块导入失败

请注意,
reload()
不会修复对旧模块的任何引用,因此实际上并不是那么有用。引用:。请记住,尽可能在线程外执行导入,尽管这很少会导致问题。这实际上帮助我解决了问题,另一个答案并不完整。这就是我要寻找的。谢谢