网站首页 > 教程分享 正文
在Python中对于import语句导入模块的问题,肯定是十分简单的,但我们今天讲的重点是说一说Python中import导入上一级目录模块及循环import的问题
import上一级目录的模块
在Python的语法中,“import module”会去用 sys.path 搜索,这里的sys.path是个列表,可以供我们去动态修改。
当我们要去导入某个目录下的模块时,需要用到sys.path.insert(0,somedir)来加入到搜索路径,这样才能实现模块的导入(import)。
但是,这样通过 import上一级目录的module,可以sys.path.insert(0,parentdir) 导入模块的方法,用到的路径是绝对路径,当主文件储存位置发生变动时,就无法成功导入。 这里就要提及到动态获取上一级目录的方法。
动态方法来获取上一级目录:
import os,sys 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)呢?
这里的遍历搜索路径,为了避免因存在同名模块而导致导入出错的问题。所以用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 from flask.ext.sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db' db = SQLAlchemy(app) from models import User
这样就产生了循环import的问题。
解决循环import的3种主要方法。
- 1.延迟导入(lazy import)
将它限制为局部作用域中,就是把import语句写在方法或函数里面。
这种方法的缺点就是会有性能问题。
- 2.将 "from AAA import BBB" 改成 "import xxx;xxx.yyy" 的访问形式
- 3.组织代码
出现循环import的问题往往意味着代码的布局有问题,那我们就可以通过合并或者分离竞争资源的方式将循环变成单向。
# ①合并的话就是都写到一个文件里面去。 # ②分离的话就是把需要import的资源提取到一个第三方文件去。
喜欢这篇文章的朋友,可以评论、转发、收藏加关注,私信“info南”回复“资料”,还可获得小编整理的Python零基础入门资料一份哦。
猜你喜欢
- 2024-09-09 彻底告别python第三方包import问题!只需要7行代码(码住)
- 2024-09-09 python每日一练之如何copy(python copy)
- 2024-09-09 你知道import Vue from 'vue' 吗?
- 2024-09-09 spring中的@import/@ImportResource注解
- 2024-09-09 Spring中@Import注解详解(spring import注解原理)
- 2024-09-09 python首行代码import *,from * import * 解析
- 2024-09-09 Import注解的理解(java @import注解)
- 2024-09-09 link与@import的区别和分别对应的例子
- 2024-09-09 第五章 import导入第三方库或者模块
- 2024-09-09 ES6模块化一缕(export、import)(es6模块化引入)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- css导航条 (66)
- sqlinsert (63)
- js提交表单 (60)
- param (62)
- parentelement (65)
- jquery分享 (62)
- check约束 (64)
- curl_init (68)
- sql if语句 (69)
- import (66)
- chmod文件夹 (71)
- clearinterval (71)
- pythonrange (62)
- 数组长度 (61)
- javafx (59)
- 全局消息钩子 (64)
- sort排序 (62)
- jdbc (69)
- php网页源码 (59)
- assert h (69)
- httpclientjar (60)
- postgresql conf (59)
- winform开发 (59)
- mysql数字类型 (71)
- drawimage (61)
本文暂时没有评论,来添加一个吧(●'◡'●)