模块循环导入报错问题,区分.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:\code\s15-17day\m1.py", line 3, in <module>
from m2 import y # ==>
File "E:\code\s15-17day\m2.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:\code\s15-17day\m1.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期\aaa\bbb')
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()
包
努力学习!