模块循环导入报错问题,区分.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()

努力学习!
原文地址:https://www.cnblogs.com/Orange-YXH/p/13648112.html