python模块导入原理

转自:http://blog.csdn.net/u012422440/article/details/41791433

今日在自学Python,借此机会,正好重新开始写博文,既可以巩固python的知识,也可顺便提高一下文笔。

一、python模块基础

言归正传,Python的模块是python语言中代码复用的最高级别,也是系统命名空间的的划分标准,也是供顶层文件(就是包含程序主要控制流程的部分)调用的工具库文件。实现模型其实很简单,任何一个python文件都可以当做模型通过import进行导入。而python的import与c或者c++的include的原理并不相同,举个例子就是:

a.py:

[python] view plain copy

  1. message="test"
  2. def printer():
  3. print("test")

b.py:

[html] view plain copy

  1. import a
  2. a.printer()

通过import 就是可以让b.py文件的顶层可以通过变量名b来获得所有的b.py在顶层定义的所有对象,比如message,printer。

二、import工作原理

之前提到python的import并不等同与c或者c++的include,因为import并不是把一个文件文本直接插入到另外一个文件中而已,在编译时进行;import其实是运行时的运算。

在程序第一次导入指定文件时,会执行三个步骤:

1.找到模块文件。

注意两点,1 导入时不需要加上文件的路径 2 导入时不需要加上文件的后缀名。

模块搜索路径:

*程序主目录

*PYTHONPATH目录

*标准链接库目录

*.pth文件目录

前三个估计大家都很了解,第四个是指python运行用户把有效的路径添加到模块搜索路径中去,也就是在.pth文件中一行一行的列出来。

2.编译成字节码(如果必要时)。

如果导入的文件并没有被编译成字节码,python会将起进行解释,如果已经存在.pyc的文件,python会检查字节码的时间戳,如果比源码的时间戳旧,程序运行时便会从新编译成为新的字节码,否则跳过编译过程。

3.执行模块的代码来创建其所定义的对象。

程序会讲导入的文件从头到尾执行一遍,在此过程中任何对变量名进行的赋值操作,都会产生得到的模块文件的属性,但是要注意这些对变量名的赋值操作必须是在模块文件的顶层进行的操作,例如使用def语句来定义函数,模块文件中便会添加这个定义的函数属性。

三、import,from,reload

import使一个变量名引用整个模块对象,我们可以通过模块名来得到或者使用该模块的属性;而from语句是将变量名复制到另一个作用域,我们可以在脚本重直接使用复制后的变量名。

需要注意的问题是导入只会发生一次,当第二次导入时,程序不会执行import工作原理中的三个步骤,而是从python内部模块表中取出已经创建的模块对象。

reload则可以从新导入模块,实现在不中断程序的前提下,重新执行import工作原理中所说的三个步骤,导入模块。reload会在模块当前的命名空间内执行模块文件的新的代码,让导入模块文件重顶层语句执行来对变量名进行从新赋值。reload会影响所有的import语句,而只会对之后使用的from语句有影响,也就是说,对于在reload之前使用from语句复制获得变量是不受reload影响的。

时间: 2024-08-08 04:09:03

python模块导入原理的相关文章

python 模块导入import和import from区别

模块就是一个.py文件,在名字空间下导入模块导入import和import from,那么python 模块导入import和import from区别是什么呢 1,import 导入模块 import 模块名 print(模块名.方法) 2,import 模块名 from 方法1,方法2 调用方法  print(方法1) 注意 import 模块名 as 别名 文章来自 www.96net.com.cn 原文地址:https://www.cnblogs.com/96net/p/9743742.

python模块导入细节

python模块导入细节 官方手册:https://docs.python.org/3/tutorial/modules.html 可执行文件和模块 python源代码文件按照功能可以分为两种类型: 用于执行的可执行程序文件 不用与执行,仅用于被其它python源码文件导入的模块文件 例如文件a.py和b.py在同一目录下,它们的内容分别是: # b.py x="var x in module b" y=5 # a.py: import b import sys print(b.x)

Python模块导入和常用内置方法

模块导入和常见内置方法 __file__: os.path.dirname(__file__)和os.path.join(dirname, filename),通过sys.path.append()可以把模块添加到Python的环境变量目录中 __name__: 直接执行py文件时__name__返回"__main__", 通过import调用时__name__返回的是(包名.模块名) __doc__: 返回.py文件中"""xxx""

python 模块导入

1. 模块导入: 要使用一个模块,我们必须首先导入该模块.Python使用import语句导入一个模块.例如,导入系统自带的模块 math: import math 你可以认为math就是一个指向已导入模块的变量,通过该变量,我们可以访问math模块中所定义的所有公开的函数.变量和类: >>> math.pow(2, 0.5) # pow是函数 1.4142135623730951 >>> math.pi # pi是变量 3.141592653589793 如果我们只希

Python模块导入的多种方式

在python中, 模块即一个后缀名为".py"文件,python用文件组织一个模块. 模块导入遵循作用域原则, 在什么作用域导入就只能在当前作用域生效. 一个模块只被加载一次,无论导入它多少次. from module import name 是把名字导入到当前的名称空间 单行导入单个模块 import json 单行导入多个模块 import os, sys, time 导入指定的模块属性 from os import path, fork, mkdir 多行导入 from Tki

python模块导入

一.模块的本质 我们写python程序经常会导入很多模块,那到底模块是什么呢?其实模块就是一个python文件,我们导入模块时的模块名就是python文件的名字,比如我们写了一个叫my_module.py的文件就可以当作模块导入其他python文件中,模块名就是my_module. 二.模块导入的两种方式 2.1.import 2.1.1.import导入模块时会做三件事: 1.为该模块生成一个独立的命名空间 2.在该命名空间中将模块的代码执行一遍 3.建立模块名到该命名空间的引用 2.1.2.

python 模块导入详解

本文不讨论 Python 的导入机制(底层实现细节),仅讨论模块与包,以及导入语句相关的概念.通常,导入模块都是使用如下语句: import ... import ... as ... from ... import ... from ... import ... as ... 一般情况下,使用以上语句导入模块已经够用的.但是在一些特殊场景中,可能还需要其他的导入方式.例如 Python 还提供了 __import__ 内建函数和 importlib 模块来实现动态导入.动态导入的好处是可以延迟

Python模块导入详解

定义 模块:用来从逻辑上组织Python代码(变量.函数.类.逻辑)去实现一个功能.本质就是.py结尾的Python文件. 包:用来从逻辑上组织模块的(可以放一堆模块在目录下).本质就是一个目录(必须带有一个__init__.py文件). 导入模块 导入单个: import 模块名 导入多个: import 模块名1,模块名2 导入模块中所有代码: from 模块名 import * import导入于from 模块名 import *导入在调用上的区别: module.function() f

python模块导入的问题

从模块导入函数时,通常可以使用 import somemodule 或者 from somemodule import somefunction 或者 from somemodule import somefunction , anotherfunction ,yetanotherfunction 或者 from somemodule import * 只有确定自己想要从给定模块导入所有功能时,才应该使用最后一个版本,但是两个模块都有同一个函数的话怎么办呢? 只需要使用第一种方式导入,然后向下面