Python中import导入上一级目录模块及循环import问题的解决

作者:mattkang 时间:2021-09-16 00:53:44 

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
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
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的方法主要有几种。
1.延迟导入(lazy import)
即把import语句写在方法或函数里面,将它的作用域限制在局部。
这种方法的缺点就是会有性能问题。
2.将from xxx import yyy改成import xxx;xxx.yyy来访问的形式
3.组织代码
出现循环import的问题往往意味着代码的布局有问题。
可以合并或者分离竞争资源。
合并的话就是都写到一个文件里面去。
分离的话就是把需要import的资源提取到一个第三方文件去。
总之就是将循环变成单向。

标签:Python,import
0
投稿

猜你喜欢

  • jQuery实现AJAX定时刷新局部页面实例

    2024-05-02 17:05:27
  • Go gRPC进阶教程gRPC转换HTTP

    2024-05-21 10:25:57
  • python字典与json转换的方法总结

    2022-10-20 07:58:56
  • PyTorch中的C++扩展实现

    2021-06-24 15:52:30
  • 走中国特色的网站重构道路

    2010-04-08 16:10:00
  • python训练数据时打乱训练数据与标签的两种方法小结

    2021-11-17 11:15:12
  • Pandas之groupby( )用法笔记小结

    2023-03-03 15:58:24
  • 用Python写一个无界面的2048小游戏

    2022-02-12 11:18:23
  • MySQL 原理与优化之原数据锁的应用

    2024-01-27 05:43:51
  • pandas数据框,统计某列数据对应的个数方法

    2023-08-12 11:39:39
  • 浅谈JavaScript函数参数的可修改性问题

    2024-05-02 17:20:29
  • 详解Go语言Slice作为函数参数的使用

    2023-07-16 11:30:20
  • PHP实现将MySQL重复ID二维数组重组为三维数组的方法

    2023-11-18 03:28:57
  • python中Mako库实例用法

    2022-01-05 16:38:21
  • Pytest+Request+Allure+Jenkins实现接口自动化

    2021-04-09 13:50:44
  • ajax代理程序,自动判断字符编码

    2007-11-04 13:17:00
  • session的存储方式和配置方法介绍

    2022-04-28 05:48:59
  • Python实现清除文件夹中重复视频

    2023-07-25 16:20:48
  • JetBrains 学生认证教程(Pycharm,IDEA… 等学生认证教程)

    2022-06-16 08:20:04
  • 在OpenCV里使用Camshift算法的实现

    2023-01-24 20:46:40
  • asp之家 网络编程 m.aspxhome.com