一日一技:导入父文件夹中的模块并读取当前文件夹内的资源
摄影:产品经理
产品经理独自在深圳吃的早餐
在某些特殊情况下,我们的 Python 脚本需要调用父目录下的其他模块。例如:
在编写 GNE 的测试用例时,有一个脚本 generate_new_cases.py
放在 tests
文件夹中。而 tests 文件夹与 gne 文件夹放在同一个位置。其中 gne 文件夹是一个包。我现在需要从generate_new_cases.py
文件中导入 gne 里面的一个类GeneralNewsExtractor
。
为了简化问题,我单独写了一个演示的样例。它的文件结构与每个文件中的内容如下:
现在,我直接在 scripts 文件夹里面运行run.py
会报错,提示从包的最顶层之外相对导入。
现在,我们改一下代码,尝试在scripts 文件夹的父文件夹中运行代码,发现还是会报错:
我们再来改一下代码,在 scripts 文件夹中,把父文件夹加入到sys.path
中:
import sys
sys.path.append('..')
运行效果如下图所示:
这种写法,当我们在scripts
文件夹里面运行run.py
时,确实已经正常了。但是如果我们在scripts
文件夹的父文件夹再运行代码,又不对了,如下图所示:
为了检查这个原因,我们打印一下sys.path
:
大家有没有发现一个很不和谐的东西:其他路径都是绝对路径,就最后我们加了两个点看起来很违和。那如果我们把这两个点换成绝对路径呢?于是尝试获取当前正在运行的这个文件的绝对路径:
import sys
from pathlib import Path
current_folder = Path(__file__).absolute().parent
father_folder = str(current_folder.parent)
sys.path.append(father_folder)
运行效果如下图所示:
导入模块已经正常了,但是读取资源文件又异常了。
这是因为,import
导入模块时,是根据sys.path
中的路径来寻找的。但是读取资源文件的时候,相对文件路径是相对于工作区来寻找的。
现在我们在~/test_import_father_module
执行python3 scripts/run.py
,那么当前的工作区就是~/test_import_father_module
。而由于资源文件是在scripts
文件夹中的,所以就找不到。
所以我们还需要修改一下工作区:
import os
from pathlib import Path
current_folder = Path(__file__).absolute().parent
os.chdir(str(current_folder))
运行效果如下图所示:
现在无论是读取资源文件还是导入模块,都已经正常了。
我们再回到 scripts 文件夹中执行看看:
发现也能正常执行。
总结
涉及到模块导入相关的环境,可以通过在sys.path
添加绝对路径
来解决。涉及到读取资源文件的相关环境,可以通过使用os.chdir
修改工作区为另一个绝对路径来解决。
- 关于order by中的数据排序(r4笔记第6天)
- 深度学习CTPN+CRNN模型实现图片内文字的定位与识别(OCR)
- Markdown语法讲解及MWeb使用教程
- 通过Linu命令实现屏幕录制和回放(r4笔记第5天)
- 用keras对国产剧评论文本的情感进行预测
- python常用可视化技巧
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(六)maven整合SSM
- 通过java程序抽取日志中的sql语句(r4笔记第4天)
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(七)JDBC url的连接参数
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(十)SVN搭建
- position:sticky的兼容性尝试
- Python爬虫股票评论,snowNLP简单分析股民用户情绪
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(十一)SVN服务器进阶
- node服务的监控预警系统架构
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- C++核心准则T.12:声明局部变量类型时,概念比auto更好
- Arch Linux切换rEFInd开机引导程序
- C++核心准则T.13:对于简单的,单类型参数概念,使用缩略记法更好
- VBA编写Ribbon Custom UI编辑器08——实现ZIP的写入
- 用 Python 写个七夕表白神器
- 3分钟短文 | Laravel 用户授权原来内置了这么多方法
- E0144"const char *" 类型的值不能用于初始化 "char *" 类型的实体的三种解决方法
- 数据采集面对JS加密无所适从?善用这3个工具,搞定一大半的JS逆向!
- 点赞功能设计与实现
- [推荐]Linux入门系列(一)换个角度看Linux其实很简单,带你一起入门
- (建议收藏)Java基础知识笔记(详细)
- 详解:小程序如何授权登录并获取用户绑定手机号?
- [Bazel]自定义命令行编译标志
- 如何部署一个Kubernetes集群
- static有什么作用?