模块导入

当文件夹中有这样一个自定义的command模块

在它的内部写下下列代码:

  1. print('这个py文件被调用!')
  2. def fuc():
  3. print('这个函数被调用!')

然后我们在command模块中执行下列代码:

  1. import command #这个py文件被调用!

我们如果在这段程序中反复执行多次这一段代码,这一个文件结果也只会被导入一次

  1. import command #这个py文件被调用!
  2. import command
  3. import command
  4. import command
  5. import command
  6. import command

调用command模块中的方法fuc()

  1. import command #这个py文件被调用!
  2. command.fuc() #这个函数被调用!

当我们写这样一个代码的时候,计算机会先去找到这一个模块,找到之后再创建这个模块的命名空间,把文件夹的名字都放在命名空间里

如果我们在temp_py.py中也写一个fuc()函数:

  1. import command #这个py文件被调用!
  2. def fuc():
  3. print('hello __fuc__')
  4. command.fuc() #这个函数被调用!

那么实际上它调用的还是command模块内的函数

如果在command模块内和temp_py.py中加入相同的变量:

command模块代码:

  1. print('这个py文件被调用!')
  2. number = 150
  3. def fuc():
  4. print('这个函数被调用!',number)    #number获取到一个内存地址再从中拿到值

temp_py.py执行代码:

  1. import command #这个py文件被调用!
  2. number = 300
  3. print(command.number) #
  4. print(number) #

当你要导入一个模块的时候,计算机会先到sys.modules()中去找你导入的这个模块是否在这个里面

  1. import command #这个py文件被调用!
  2. import sys
  3. print(sys.modules.keys()) #dict_keys(['sys', 'builtins', '_frozen_importlib', '_imp', '_thread', '_warnings', '_weakref', 'zipimport', '_frozen_importlib_external', '_io', 'marshal', 'nt', 'winreg', 'encodings', 'codecs', '_codecs', 'encodings.aliases', 'encodings.utf_8', '_signal', '__main__', 'encodings.latin_1', 'io', 'abc', '_abc', 'site', 'os', 'stat', '_stat', 'ntpath', 'genericpath', 'os.path', '_collections_abc', '_sitebuiltins', '_bootlocale', '_locale', 'encodings.gbk', '_codecs_cn', '_multibytecodec', 'encodings.cp437', 'command'])

在最后我们可以看到之前的command模块有被成功导入

如果我们要找的这个模块在sys.modules()中找不到,那么就依据sys.path()路径去找到模块,若找到就创建这个模块的命名空间再把文件名陈放在内存里并执行,若找不到那么就会报错

给模块取别名:

语法:import '模块名' as '别名'

  1. import command as comd #这个py文件被调用!
  2. comd.fuc() #这个函数被调用! 150
  3. import time as t
  4. print(t.time()) #1567359703.0011516
  5. print(time.time()) #NameError: name 'time' is not defined

假设有两个模块xmlreader.py和csvreader.py,它们都定义了函数read_data(filename):用来从文件中读取一些数据,但采用不同的输入格式.可以编写代码来选择性地挑选读取模块,例如

  1. if file_format == 'xml':
  2. import xmlreader as reader
  3. elif file_format == 'csv':
  4. import csvreader as reader
  5. data=reader.read_date(filename)

一行获取模块:

  1. import sys,os,pickle,shelve,json

不推荐这样写后期不好维护,建议一行一行写在开头,能够让人一目了然

模块的写法顺序:

内置模块(re、time等)、扩展的模块(django等)、自定义的模块

from...import...的用法

  1. from time import time
  2. print(time()) #1567360779.0056956
  3. from sys import version
  4. print(version) #3.7.1 (default, Dec 10 2018, 22:54:23) [MSC v.1915 64 bit (AMD64)]

在pycharm中,如果是自定义模块要用from...import...调用方法有红色的波浪线报错是因为pycharm主观认为从根目录去找这个模块,结果却找不到,但其实这个模块可以从sys.path()中找到

若在temp_py.py定义一个和fuc同名的函数,让我们来看看执行结果:

  1. from command import fuc #这个py文件被调用!
  2. def fuc():
  3. print('!!!!!!!') #!!!!!!!
  4. fuc()

也支持获取多个方法:

from 模块名 import *

它能把模块内的名字都调用

缺点:不安全怕重名

  1. from time import *
  2. sleep = 10
  3. sleep(0.1) #TypeError: 'int' object is not callable

__all__

只和from 模块名 import *有关

如果有被__all__约束住那么才能够执行

__name__

当我们直接执行这个模块的时候,这里的__name__就等于'__main__'

  1. __all__ = ['number','fuc']
  2. print('这个py文件被调用!')
  3. number = 150 #这里的值已经放到了内存地址中
  4. def fuc():
  5. print('这个函数被调用!',number)
  6. def fuc2():
  7. print('fuc2')
  8. def fuc3():
  9. print('fuc3')
  10. print(__name__)    #__main__

当我们执行其他模块的时候,在其他模块中引用这个模块,这个模块中的__name__就等于'这个模块的名字'

  1. import command #这个py文件被调用!
  2. #command

有些时候当我们在其他模块中调用模块时,调用的这个模块本身可能有一些测试的代码,如果我们直接调用的话那么这些测试的代码也会跟着一起执行出来,但是实际上我们在调用这个模块的时候并不想让它里面的内容直接就跑出来,所以我们就要在这个模块中添加一个判断来确定它的__name__

当在这个模块执行时:

  1. __all__ = ['number','fuc']
  2. print('这个py文件被调用!')
  3. number = 150 #这里的值已经放到了内存地址中
  4. def fuc():
  5. print('这个函数被调用!',number)
  6. def fuc2():
  7. print('fuc2')
  8. def fuc3():
  9. print('fuc3')
  10. if __name__ == '__main__':
  11. print('执行下列调试代码或其他功能代码...') #执行下列调试代码或其他功能代码...

在其他模块调用这个模块时,模块中的那些调试代码就不会再被直接执行了

  1. import command #这个py文件被调用!

Python学习日记(十九) 模块导入的更多相关文章

  1. Python学习笔记十_模块、第三方模块安装、模块导入

    一.模块.包 1.模块 模块实质上就是一个python文件.它是用来组织代码的,意思就是把python代码写到里面,文件名就是模块的名称,test.py test就是模块的名称 2.包 包,packa ...

  2. Python学习日记(十八) 序列化模块

    什么是序列? 就是每一个元素被有序的排成一列 什么是序列化? 就是将原本的列表.字典等内容转化成字符串的过程 什么时候会用到序列化? 数据存储(把数据放在文件.数据库),网络传输等 序列化的目的 1. ...

  3. Python学习日记(十六) time模块和random模块

    time模块 python表示时间的三种方式:时间戳.元祖(struct_time).格式化时间字符串 三种格式之间的转换: 1.时间戳 就是从1970年1月1日0点0分0秒开始按秒计算的偏移量,时间 ...

  4. Python学习日记(九)—— 模块二(logging、json&pickle、xml、requests、configparser、shutil、subprocess)

    logging模块 用于便捷记录日志且线程安全的模块(便捷的写文件的模块,不允许多个人同时操作文件) 1.单文件日志 import logging logging.basicConfig(filena ...

  5. Python学习日记(十五) collections模块

    在内置函数(dict.list.set.tuple)的基础上,collections模块还提供了几个其他的数据类型:Counter.deque.defaultdict.namedtuple和Order ...

  6. Python学习日记(十四) 正则表达式和re模块

    正则表达式: 它是字符串的一种匹配模式,用来处理字符串,可以极大地减轻处理一些复杂字符串的代码量 字符组:它是在同一位置可能出现的各种字符组成了一个字符组,用[]表示,但是它的结果只能是一个数字或者一 ...

  7. python学习日记(常用模块)

    模块概念 什么是模块 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写的代 ...

  8. python 学习笔记十九 django深入学习四 cookie,session

    缓存 一个动态网站的基本权衡点就是,它是动态的. 每次用户请求一个页面,Web服务器将进行所有涵盖数据库查询到模版渲染到业务逻辑的请求,用来创建浏览者需要的页面.当程序访问量大时,耗时必然会更加明显, ...

  9. Python学习日记(十七) os模块和sys模块

    os模块 1.os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 import os print(os.getcwd()) #C:\Users\Administrator\ ...

随机推荐

  1. MongoDB笔记: 常见问题

    系统配置 设置ulimit MongoDB的文件机制 每个Collection会单独创建一个数据文件(collection-xxxxxx.wt) 每个索引会单独创建一个文件(index-xxxxxx. ...

  2. (九)Knockout 进一步技术

    加载和保存 JSON 数据 Knockout允许您实现复杂的客户端交互,但是几乎所有web应用程序还需要与服务器交换数据,或者至少要序列化数据以供本地存储.交换或存储数据最方便的方式是JSON格式-- ...

  3. mysql 中 int 等类型如何选择

    详见:https://blog.csdn.net/samll_snail/article/details/86534719 .

  4. ubantu使用ssh服务

    Secure Shell(SSH)是一种加密网络协议,用于在不安全的网络上安全地运行网络服务.利用SSH可以实现加密并安全地远程登录计算机系统. Ubuntu安装后默认只有ssh客户端,即只能在Ubu ...

  5. [Kaggle] Online Notebooks

    前言 Let's go to https://www.kaggle.com/ Kaggle Notebook 有实践记录的案例. 一.线性拟合噪声数据 [Sklearn] Linear regress ...

  6. openstack虚拟机获取不到ip

    一.现象描述: openstack平台中创建虚拟机后,虚拟机在web页面中显示获取到了ip,但是打开虚拟机控制台后查看网络状态,虚拟机没有ip地址,下图为故障截图: 二.分析思路: (1)查看neut ...

  7. oracle plsql 异常

      set serveroutput on DECLARE pename emp.ename%type; begin '; exception when no_data_found then dbms ...

  8. [图片问答]lodop注册相关

    相关博文:LODOP和C-LODOP注册与角色等简短问答[增强版]由于其他博文要么图片太花哨(PS做的所以太花哨),要么文字太啰嗦,所以做了简短问答的图片,更简洁直观方便.1.该购买哪种LODOP注册 ...

  9. Influx Sql系列教程零:安装及influx-cli使用姿势介绍

    influxdb 时序数据库,因为实际业务中使用到了,然而并没有发现有特别好的文章,完整的介绍influx sql的使用姿势,因此记录下实际开发中学习的体会,主要参考来自于官方文档 Influx Qu ...

  10. Maven中解决jar包冲突的三种方式

    首先我们在idea中创建一个maven工程,我们只关注pom.xml以及External Libraries中导入的jar包 导入spring-beans.jar <dependency> ...