这几天,被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

Python中模块与包的导入(朴实易懂版的总结)的更多相关文章

  1. python中模块,包,库的概念

    模块:就是.py文件,里面定义了一些函数和变量,需要的时候就可以导入这些模块. 包:在模块之上的概念,为了方便管理而将文件进行打包.包目录下第一个文件便是 __init__.py,然后是一些模块文件和 ...

  2. python的模块与包的导入

    类似于C语言的包含头文件去引用其他文件的函数,python也有类似的机制,常用的引入方法有以下 import 模块名 #模块名就是py文件名 #使用这种方法以后调用函数的时候要使用模块名.函数名()这 ...

  3. python之模块、包的导入过程和开发规范

    摘要:导入模块.导入包.编程规范 以My_module为例,My_module的代码如下: __all__ = ['name','read'] print('in mymodule') name = ...

  4. python中模块,包,库

    模块:就是.py文件,里面定义了一些函数和变量,需要的时候就可以导入这些模块. 包:在模块之上的概念,为了方便管理而将文件进行打包.包目录下第一个文件便是 __init__.py,然后是一些模块文件和 ...

  5. python 中 模块,包, 与常用模块

    一 模块 模块:就是一组功能的集合体, 我们的程序可以直接导入模块来复用模块里的功能 导入方式 一般为 : import 模块名 在python中, 模块一般分为四个通用类别 1使用python编写. ...

  6. Python中 模块、包、库

    模块:就是.py文件,里面定义了一些函数和变量,需要的时候就可以导入这些模块. 包:在模块之上的概念,为了方便管理而将文件进行打包.包目录下第一个文件便是 __init__.py,然后是一些模块文件和 ...

  7. python中模块、包、库的区别和使用

    模块:就是.py文件,里面定义了一些函数和变量,需要的时候就可以导入这些模块. 包:在模块之上的概念,为了方便管理而将文件进行打包.包目录下第一个文件便是 __init__.py,然后是一些模块文件和 ...

  8. python中模块和包的概念

    1.模块 一个.py文件就是一个模块.这个文件的名字是:模块名.py.由此可见在python中,文件名和模块名的差别只是有没有后缀.有后缀是文件名,没有后缀是模块名. 每个文件(每个模块)都是一个独立 ...

  9. python中模块与包

    #模块与包#在实际项目中,代码的行数可能上万,甚至上几十万,不可能在一个页面内完成,需要多个程序员通力写作#张三,李四,王五......每天收集大家的代码做一个版本,类似乐高积木一样,每个人负责一部分 ...

随机推荐

  1. js的事件冒泡机制

    js的事件冒泡机制呢,就是一个DOM树,一级一级向上冒的过程,最终是到document这个根节点这里.js的事件冒泡机制,就像是一个水泡在水底下,冒泡到水面的过程. 摘自醉清玄

  2. 题解 P2949 【[USACO09OPEN]工作调度Work Scheduling】

    P2949 [USACO09OPEN]工作调度Work Scheduling 题目标签是单调队列+dp,萌新太弱不会 明显的一道贪心题,考虑排序先做截止时间早的,但我们发现后面可能会出现价值更高却没有 ...

  3. JS系列1---节流,去抖(防抖)应用场景:intput请求优化,页面监听

    在项目开发过程中经常遇到在input的change事件中发起请求,将用户最新输入的字符作为data传给后台,但是如果用户的输入频率过高,或者用户输入的字符还未拼成一个完整的字词,这时候发起请求会浪费网 ...

  4. [leetcode] 679. 24 Game (Hard)

    24点游戏,游戏规则就是利用().+.-. *. /,对四个数字任意运算,可以得出24点则为true. 排列组合问题,最多有A42*A32*A22*4*4*4,也就是12*6*2*4*4=9216种组 ...

  5. 以for循环的方式了解var与let的区别

    var是ES5定义变量的一种声明方式. let是ES6定义变量的一种声明方式---可定义局部变量,即定义块级作用域. 以下列简单的函数进行表现二者作用域的不同 在ES6之前,我们都是用var来声明变量 ...

  6. js数字格式化(截断格式化或四舍五入格式化)

    /*** * 数字格式化(适合金融产品截断小数位后展示) * @param num * @param pattern (标准格式:#,###.## 或#.## 或#,###00.00) * @para ...

  7. Vue的基本使用(二)

    1.数据的双向绑定 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  8. Windows环境下main()函数传入参数

    最近几天在写一个模仿windows自带的ping程序,也从网上找过一些源码,但大都需要向主函数main中传入参数,这里简单总结一下向主函数中传参的方法. 方法一:项目->属性->调试-&g ...

  9. 数据库---T-SQL语句(一)

    一.T-SQL语句 1.创建表:create table Name(Code varchar(50),) 主键:primary key 自增长:auto_increment 外键关系:referenc ...

  10. Java常用命令及参数

    Java的基本指令参数 javac [-d 目录|-verbose] file java [-classpath(cp) dir] file jar -zcvf dir file javap [-pr ...