最近项目组用python,慢慢开始学习了。第一天就遇到了import问题。
python语言的import有两种方法,一个是import 模块名,一个是from 模块名 import 函数或者类或者变量。
直接import只能import模块,不能import 模块里面的内容。使用内容必须加上模块名。
在import的时候,系统会把所有的加载的模块载入内存,并且放入一个map中,from A import B的过程是,看是否有A模块在系统中加载,如果有则直接拿出来,否则新建一个,这时需要填充A模块的内容,就需要执行A模块的文件。一旦构建好了A模块,那么就可以从A里面取B了,如果没有就报错。
上述逻辑是如果用A,A没有载入,就执行A,否则就直接返回A的函数或者变量。这个时候就有一个问题,当前脚本Main第一次执行,需要执行from A import ,发现没有A,就新建一个A在内存中,然后填充A模块的信息,就会去执行A,此时,A里面要 from Main import D,那么因为Main已被执行,就直接从内存的map中取得Main的信息,不过此时Main的信息还没有填充完,因为之前就是为了填充才转到A的,这时从已有的空的Main中拿不到D,就会报错,ImportError。
所以,项目中尽量不要循环import,很可能会产生这样的错。那么一旦产生怎么解决?
可以把import语句尽可能往后放,比如放到文件最后,那么应该是没问题的,因为执行到import时,已经确保了当前的脚本的内容已经注册到了内存的map中。
当然也可以放到函数的内部,即其他模块的调用处。
from lib import lib1
def func1():
print("main.func1")
lib1()
def func2():
print("main.func1")
func1()
main.py
from main import func2
def lib1():
func2()
print("lib.lib1")
def lib2():
func2()
lib.py