zoukankan      html  css  js  c++  java
  • 模块循环导入报错问题,区分.py文件的两个用途,模块的搜索路径和查找优先级

    今日内容

    一,循环导入问题解决

    执行文件:

    x=1
    import m1
    
    print(m1.x)
    print(m1.y)
    

    m1.py文件

    print('正在导入m1')
    from m2 import y # ==>
    x='m1'
    

    m2.py文件

    print('正在导入m2')
    from m1 import x
    y='m2'
    

    报错:

    正在导入m1
    正在导入m2
    Traceback (most recent call last):
      File "E:/code/s15-17day/01  循环导入问题.py", line 6, in <module>
        import m1
      File "E:codes15-17daym1.py", line 3, in <module>
        from m2 import y # ==>
      File "E:codes15-17daym2.py", line 3, in <module>
        from m1 import x
    ImportError: cannot import name 'x' from partially initialized module 'm1' (most likely due to a circular import) (E:codes15-17daym1.py)
    

    修改方法一:

    执行文件:

    x=1
    import m1
    
    print(m1.x)
    print(m1.y)
    

    m1.py文件

    print('正在导入m1')
    x='m1'
    from m2 import y # ==>
    

    m2.py文件

    print('正在导入m2')
    y='m2'
    from m1 import x
    

    结果:

    正在导入m1
    正在导入m2
    m1
    m2
    

    修改方法二:放进函数内

    执行文件:

    x=1
    import m1
    print(m1.x)
    print(m1.y)
    

    m1.py文件

    print('正在导入m1')
    def f1():
        from m2 import y # ==>
        print(x,y)
    x=999
    f1()
    

    m2.py文件

    print('正在导入m2')
    def f2():
        from m1 import x
        print(x,y)
    y=2
    

    结果:

    正在导入m1
    正在导入m2
    999 2
    

    二,区分py文件的两种用途

    1,name

    • 1.当文件被当做脚本直接执行时,name__值为__main
    • 2.当文件被当做模块导入时,name__值为__文件名__

    示例:

    def f1():
        print('spam.f1')
    def f2():
        print('spam.f2')
    if __name__ == '__main__':
        print("文件被当作脚本执行时要做的事情")
        f1()
        f2()
    

    结果

    文件被当作脚本执行时要做的事情
    spam.f1
    spam.f2
    

    示例二:

    import  sun
    def f1():
        print('spam.f1')
    def f2():
        print('spam.f2')
    # if __name__ == '__main__':
    #     print("文件被当作脚本执行时要做的事情")
    #     f1()
    #     f2()
    print(sun.__name__)
    

    结果

    sun
    

    三,模块的搜索路径与查找优先级

    (1) 先从内存中已经导入的模块里找

    操作方法:

    先创建一个mmm.py模块

    在运行以后15秒内删除它

    观察15秒以后他是否会报错。

    然后关闭进程,再次运行

    是不是会报错

    import mmm
    mmm.f1()
    
    import time
    time.sleep(15)
    
    print('='*50)
    import mmm
    mmm.f1()
    

    (2) 然后再查找内置的模块

    import sys
    print(sys.modules)
    
    import sys
    print(sys.path)
    

    (3) 最后去sys.path列表中存放的多个文件夹里依次检索

    # 示例1:
    import sys
    print(sys.path)
    sys.path.append(r'D:python全栈15期aaabb')
    
    import ccc
    
    ccc.f1()
    
    # 示例2:
    import sys
    print(sys.path)
    import aaa.bbb.ccc as c
    c.f1()
    
    from aaa.bbb import ccc
    ccc.f1()
    

    努力学习!
  • 相关阅读:
    [转]SVN 乱码问题
    [转]自己做 Visual Studio 2013 代码折叠插件
    [Java]一步一步学 Web
    [转]SQL Server 结构读取
    [转][c#]注册表经验集
    [转]加密经验集 => C#
    [转]Oracle 连接dll
    《高效能程序员的修炼》读书笔记
    Blend for Visual Studio 2013
    ASP.NET中服务器控件的生命周期
  • 原文地址:https://www.cnblogs.com/Orange-YXH/p/13648112.html
Copyright © 2011-2022 走看看