Python中import导⼊上⼀级⽬录模块及循环import问题的
解决
import上⼀级⽬录的模块
python中,import module会去sys.path搜索,sys.path是个列表,并且我们可以动态修改。
要import某个⽬录的module,我们sys.path.insert(0,somedir)来加⼊搜索路径,就可以import了。
既然这样,要import上⼀级⽬录的module,可以sys.path.insert(0,parentdir)。
不过这种写绝对路径的⽅式,如果⽂件放到其它地⽅,就不⾏了。
所以⽤动态⽅法来获取上⼀级⽬录。
import os,sys
import语句parentdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0,parentdir)
为什么⽤sys.path.insert(0,parentdir) ⽽不是⽤sys.path.append(parentdir)呢
因为是遍历搜索路径的,所以如果在其它路径⾥也有个同名的module,会import错。⽤sys.path.insert(0,parentdir)可以确保先搜索这个路径。
解决循环import的问题
在python中常常会遇到循环import即circular import的问题。
现实中经常出现这种滑稽的情况,
安装⽆线⽹卡的时候,需要上⽹下载⽹卡驱动..
安装压缩软件的时候,从⽹上下载的压缩软件安装程序居然是被压缩了的..
循环依赖就类似于这种情况。
举个栗⼦,
在models.py中,
from server import db
class User(db.Model):
pass
在server.py中,
from flask import Flask
sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy(app)
from models import User
这样就产⽣了循环import的问题。
解决循环import的⽅法主要有⼏种。
1.延迟导⼊(lazy import)
即把import语句写在⽅法或函数⾥⾯,将它的作⽤域限制在局部。
这种⽅法的缺点就是会有性能问题。
2.将from xxx import yyy改成import 来访问的形式
3.组织代码
出现循环import的问题往往意味着代码的布局有问题。
可以合并或者分离竞争资源。
合并的话就是都写到⼀个⽂件⾥⾯去。
分离的话就是把需要import的资源提取到⼀个第三⽅⽂件去。
总之就是将循环变成单向。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论