Python中模块与包的导入(朴实易懂版的总结)
2024-09-01 06:07:58
这几天,被python包与模块的导入问题,折磨的不行,以前想的很简单,其实不然,经查资料研究,特总结如下:
基本注意点
- 模块:一般指一个py文件;包:含有许多py文件的文件夹,含有 或不含有(Python3中允许)__init__文件。
- 凡是在导入时带点的,点的左边都必须是一个包 (import a.fun1 其中a为py文件)这种导入形式是错误的。
2.from a import fun1 a为一个py文件,fun1为该文件的属性或方法,这种导入形式是可以的。 - 一般来说 import 后面不能带点,如:(from a import b.c是错误语法)
- 导入模块时,是将模块的py文件导入进去(执行);导入包时,只会执行包中的__init__文件中的代码,故导入包时一般要导入到最底层,即from dir1.dir2.dir3 import py文件或者类、方法、属性,只有这样才能找到。但是你可以通过先导入一个包,然后在包的文件中的__init__中写相关的import语句(可以绝对,也可以相对),这样也可以通过import 包名 的方式将包中的东西导入进去。
例如:
文件结构
示例1
- 以p0.py为直接执行文件,如在p0文件输入:
import bin
- 在bin文件夹的__init__.py文件中输入:
from . import dir # 相对导入 或者绝对导入: from bin import dir
- 最后,在dir 的__init__.py文件中输入:
from . import p3
# 注意,这时的绝对导入必须为:
from bin.dir import p3
# 因为:后面第四条的给出了原因,dir并不在此时的sys.path中
- 通过以上语句,就能实现从po文件中,仅仅通过import bin 就能导入p3文件去po里面
- 直接执行某个py文件时,会将当前py文件所在的目录添加到sys.path中,而其它模块被被导入其中时并不会将其它模块所在的目录放进sys.path中。
- 用相对路径导入: “.”表示当前目录,“..”表示上一层目录,注意这里的当前表示要导入的某个py文件所在的目录,上一层同理。相对导入时不用考虑是否在sys.path中,一般写在一个包中的__init__文件中。常用于包外使用,从包外某个py文件导入包内某些文件。见示例1的模式
Python import 的搜索路径(即sys.path)
- 在当前目录下搜索该模块,(注意在pycharm中,pycharm会将你的项目路径添加到sys.path中),从这里看出,你所导入到的模块或者包或者模块所在的包,必须是与直接执行的文件同级,
例如 示例1:直接直接执行p0.py sys.path 添加的就是 test目录,那么只有 bin、main 能搜索到,所以from bin.dir import p3是可以的。 - 在环境变量 PYTHONPATH 中指定的路径列表中依次搜索
- 在 Python 安装路径的 lib 库中搜索
软件开发规范
这是程序文件结构的一般规范,里面涉及到包与模块的导入问题
- ①为了能在bin文件下的start.py文件中引入core文件夹下的core.py中的main()函数,(即跨同一目录下的 两个包导入,一般需要将两包的共有目录添加到sys.path中)
start.py文件代码为:(为通用格式)
import os
import sys
sys.path.append(os.path.dirname(os.getcwd()))
from core import core # 注意第一个core为包名,第二为py文件名
if __name__ == '__main__':
core.main()
- ②假如,core文件中写了两个py文件,一个为core.py,另一个为 log_in.py ,为了能在core.py中导入log_in模块,
# 方法1
import log_in
方法1是错的,因为程序的主入口(直接执行的)为start.py文件,又由于添加了项目目录(soft)到sys.path中,故此时sys.path中含有 bin、soft、其它python解释器文件路径,所以无法导入
# 方法2
from core import log_in
方法2是对的 ,因为start.py中已添加项目目录(soft)到sys.path中
参考:https://www.cnblogs.com/linhaifeng/articles/6379069.html
最新文章
- java 获取当月第一天和最后一天 获取前一个月第一天和最后一天
- JSContext
- 不知道数据库中表的列类型的前提下,使用JDBC正确的取出数据
- ubuntu 修改默认root及密码
- jsp iframe example
- Spring+Struts2+Mybatis框架搭建时的常见典型问题
- VS中使用系统的环境变量作为INCLUDE和LIBPATH的值
- Ref相关的名词解释
- 分享一个牛逼的PHP无限极分类生成树方法,巧用引用(转)
- Windows资源文件里VarFileInfo的Translation(EXE的语言描述信息)
- bind和live
- JAVA中IO和NIO的详解分析,内容来自网络和自己总结
- 工作中MySql的了解到的小技巧
- JavaScript 流程语句知识脑图
- springboot + redis(单机版)
- 3D Slicer中文教程(一)—下载及安装方法
- 团队Scrum冲刺阶段-Day 6
- vue项目如何通过前端实现自动识别并配置服务器环境地址
- 学习windows编程 day4 之 设置画刷
- linux下挂载VHD等虚拟磁盘文件
热门文章
- UVA10071 Back to High School Physics:题解
- [二次编码,数据类型补充以及各种坑]https://i.cnblogs.com/EditPosts.aspx?postid=11184330
- C#3.0新增功能09 LINQ 标准查询运算符 03 按执行方式的分类
- Quartus ii调试技巧_01
- 【HTML】HTML标签介绍
- rabbitMQ_helloworld(一)
- CDN绕过姿势小结
- JWT token 跨域认证
- HTML 第5章CSS3美化网页元素
- JavaScript数据结构——字典和散列表的实现