这几天,被python包与模块的导入问题,折磨的不行,以前想的很简单,其实不然,经查资料研究,特总结如下:

基本注意点

  1. 模块:一般指一个py文件;包:含有许多py文件的文件夹,含有 或不含有(Python3中允许)__init__文件。
  2. 凡是在导入时带点的,点的左边都必须是一个包 (import a.fun1 其中a为py文件)这种导入形式是错误的。

    2.from a import fun1 a为一个py文件,fun1为该文件的属性或方法,这种导入形式是可以的。
  3. 一般来说 import 后面不能带点,如:(from a import b.c是错误语法)
  4. 导入模块时,是将模块的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里面
  1. 直接执行某个py文件时,会将当前py文件所在的目录添加到sys.path中,而其它模块被被导入其中时并不会将其它模块所在的目录放进sys.path中。
  2. 用相对路径导入: “.”表示当前目录,“..”表示上一层目录,注意这里的当前表示要导入的某个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

最新文章

  1. java 获取当月第一天和最后一天 获取前一个月第一天和最后一天
  2. JSContext
  3. 不知道数据库中表的列类型的前提下,使用JDBC正确的取出数据
  4. ubuntu 修改默认root及密码
  5. jsp iframe example
  6. Spring+Struts2+Mybatis框架搭建时的常见典型问题
  7. VS中使用系统的环境变量作为INCLUDE和LIBPATH的值
  8. Ref相关的名词解释
  9. 分享一个牛逼的PHP无限极分类生成树方法,巧用引用(转)
  10. Windows资源文件里VarFileInfo的Translation(EXE的语言描述信息)
  11. bind和live
  12. JAVA中IO和NIO的详解分析,内容来自网络和自己总结
  13. 工作中MySql的了解到的小技巧
  14. JavaScript 流程语句知识脑图
  15. springboot + redis(单机版)
  16. 3D Slicer中文教程(一)—下载及安装方法
  17. 团队Scrum冲刺阶段-Day 6
  18. vue项目如何通过前端实现自动识别并配置服务器环境地址
  19. 学习windows编程 day4 之 设置画刷
  20. linux下挂载VHD等虚拟磁盘文件

热门文章

  1. UVA10071 Back to High School Physics:题解
  2. [二次编码,数据类型补充以及各种坑]https://i.cnblogs.com/EditPosts.aspx?postid=11184330
  3. C#3.0新增功能09 LINQ 标准查询运算符 03 按执行方式的分类
  4. Quartus ii调试技巧_01
  5. 【HTML】HTML标签介绍
  6. rabbitMQ_helloworld(一)
  7. CDN绕过姿势小结
  8. JWT token 跨域认证
  9. HTML 第5章CSS3美化网页元素
  10. JavaScript数据结构——字典和散列表的实现