如何防止模块导入两次?

KL.*_*KL. 29 python import module

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

#ifndef XXX
#define XXX
...
#endif
Run Code Online (Sandbox Code Playgroud)

非常感谢!

Nou*_*him 40

Python模块不会多次导入.只运行两次导入将不会重新加载模块.如果要重新加载它,则必须使用该reload语句.这是一个演示

foo.py 是一个单行模块

print "I am being imported"
Run Code Online (Sandbox Code Playgroud)

这是一个多次导入尝试的屏幕记录.

   >>> 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
Run Code Online (Sandbox Code Playgroud)

  • 请注意`reload()`不会修复对旧模块的任何引用,因此实际上并没有那么有用. (9认同)

Ign*_*ams 18

导入缓存,只运行一次.其他导入仅花费查找时间sys.modules.


Yoe*_*oel 15

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

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

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

    这是因为在程序启动期间,主模块设置了名称__main__.因此,当将其作为普通模块导入时,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
    
    Run Code Online (Sandbox Code Playgroud)

    另一个文件/tmp/b.py有一个针对a.py(import a)的import语句.
    执行/tmp/a.py会产生以下输出:

    root@machine:/tmp$ python a.py
    a.py executing as __main__, recognized as <module '__main__' from 'a.py'> in sys.modules
    /tmp/a.pyc executing as a, recognized as <module 'a' from '/tmp/a.pyc'> in sys.modules
    
    Run Code Online (Sandbox Code Playgroud)

    因此,最好将主模块保持在相当小的范围,并将其大部分功能导出到外部模块,如此处所述.

  • 此答案指定了另外两种可能的情况:

    1. sys.path导致同一模块使用不同条目的导入语句略有不同.
    2. 在前一个模块中途失败后尝试再次导入模块.

  • 这实际上帮助我解决了问题,另一个答案并不完整. (4认同)
  • 这就是我要找的.谢谢. (2认同)