12 python中模块和包如何导入

1 模块的三种类型

  • python标准库
    python自带的标准库,比如常用的有os,sys,re,logging等

  • 第三方模块
    需要安装第三方模块以后才能导入,比如django

  • 应用程序自定义模块

2 模块导入的方法

  • import 语句
import module1[, module2[,... moduleN]

当使用import语句时,Python解释器会从sys.path所存的的路径里搜索对应的模块。sys.path的内容示例:

['', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu',
'/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages']  

若在当前目录下存在与要引入模块同名的文件,就会把要引入的模块屏蔽掉,所以不能用系统的模块名当做新建文件的文件名。

  • from…import 语句
from modname import name1[, name2[, ... nameN]]

该语句不会把整个modulename模块导入到当前的命名空间中,只会将它里面的name1或name2单个引入到执行这个声明的模块的全局符号表中。

  • From…import* 语句
from modname import *

该语句可以导入一个模块中的所有项目。然而这种声明不建议使用,因为引入的其它来源中函数的命名很可能与当前模块中的函数名冲突。

运行本质:
#1 import test
#2 from test import add  
无论1还是2的方式,首先会通过sys.path找到test.py,然后执行test脚本(全部执行),区别是1会将test这个变量名加载到名字空间,而2只会将add这个变量名加载进来。
  • 利用importlib模块
t= importlib.import_module('m1.t')   #导入m1下面的t模块
t.test()      #调用t里面的test()

3 包package

python 中每建一个package,里面会多一个init.py文件,即该文件的出现表明该文件夹是一个包。包调用时执行的就是init.py文件

  • package 的作用:为了避免模块名冲突
  • 模块导入中常用的知识点
    (1)每执行一个文件时,系统会将该执行文件所在的文件夹路径添加到sys.path中。
    (2)多层包文件的调用



    在hanshu.py中调用rizhi.py里面的logger()函数的方法:

#方式一:
from web.web1.web2 import rizhi
logger=rizhi.logger()
logger.info("test1")

#方式二:
from web.web1.web2.rizhi import logger
logger=logger()
logger.info("test2")

#方式三 :错误的方式
from web.web1 import web2  #执行的是web2里面的__init__.py文件,而不是rizhi.py文件,所以后面会报错
logger=web2.rizhi.logger()   #报错AttributeError: module 'web.web1.web2' has no attribute 'rizhi'
logger.info('test3')
  • if name=="main"的作用:
    (1)只有当当前文件为执行文件时,name才为main,否则name为文件的名字,比如web.web1.web2.rizhi。
    (2)if name=="main"是用来测试文件代码用的,如何直接执行测试文件,一定会执行下面的代码,否则不会执行。
  • BASE_DIR的使用

如果在nod1.py里面import hello是会报错的,因为执行nod1.py时只会将app的路径加到sys.path里面,而app下面没有hello.py文件,所以会报找不到hello的错误(由于pycharm会将app的上层目录myapp加进sys.path,所以在pycharm中不会报错)。
通常需要手动将myapp的路径加到sys.path里面,操作如下:

BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
g

在nod1.py里面的BASE_DIR为myapp的目录。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容

  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,737评论 0 10
  • 〇、前言 本文共108张图,流量党请慎重! 历时1个半月,我把自己学习Python基础知识的框架详细梳理了一遍。 ...
    Raxxie阅读 18,941评论 17 410
  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 4,211评论 4 16
  • 一、模块 1、模块和导入 当程序代码量变得相当大、逻辑结构变得非常复杂的时候,我们最好把代码按照逻辑和功能划分成一...
    常大鹏阅读 2,981评论 0 9
  • 模块 一个模块就是包含了python定义和声明的文件,文件名就是模块名字加上.py后缀,通过导入模块来引入其他文件...
    断尾壁虎V阅读 1,600评论 0 1