Python中的import语句是导入一个文件,这条语句主要做三件事:

1 通过一定的方式,搜寻要导入的文件;

2 如果需要,就编译这个文件;

3 运行这个文件

但是,需要注意的是,所有这三个步骤,都只是文件再第一次导入的时候才会执行,如果文件已经导入了,后续的import会直接从内存里面找到已经加载的模块使用,换句话说,此时,import不会执行上面的3个步骤。

搜寻文件

在上面3个步骤中,最重要的就是搜寻要导入的文件。搜寻的的路径由5部分组成:

1 程序的Home目录

程序的Home目录根据运行程序的方式而不同。如果你是使用python python_program.py的方式来运行,那么,程序的Home目录就是python_program.py所在的目录;如果你是进入了python的可交互式命令行,那么程序的Home目录就是你启动可交互式命令行时,所在的目录。但是,如果你的*.py文件存在Home目录的子目录下面,那么,Python是不会自动搜寻子目录的。

2 PYTHONPATH环境变量

环境变量PYTHONPATH可以指定Python要搜索的目录,如果要设置,最好在前面加上export,即export PYTHONPATH=指定的目录

3 标准库目录

Python会自动搜寻标准库目录

4 .pth文件指定的目录

Python可以识别一个.pth文件,这个文件中每行指定一个搜寻目录。根据系统的不同,这个文件需要放置的位置也不一样。例如,如果你的系统是Windows的,那么这个文件可能需要放在Python的安装目录下,或者安装目录下的Lib/site-packages下面;如果你的系统是Unix-like的,那么,这个文件可能要放在/usr/local/lib/python3.3/site-packages或者/usr/local/lib/site-python下面。具体情况,需要参考Python的library document。

5 第三方扩展的Lib/site-package目录

Python会将第三方扩展库安装在这个目录下面,使它成为搜索路径的一部分。

上面提到的搜索路径方式,只是一个通用的方案,具体实现细节还要看各自的Python实现。要查看自己Python的搜索路径,可以使用sys module,通过sys.path就可以打印出自己Python实现的搜索路径,非常方便。

按需编译

Python并不是每一次导入文件,都会重新编译,Python编译的条件是:

1 Python源文件时戳比相应的字节码文件新,那么就重新编译;

2 对于<Python 3.2的版本来说,如果当前的Python实现和字节码中的"magic number"包含的版本号不一样,就会重新编译;对于>=Python 3.2之后的版本,如果字节码文件名中指定的版本号与当前Python实现不一样,也会重新编译

一旦编译导入成功,Python就会把字节码存入到内存中,通过sys.modules可以查看内存中存储的导入模块

import可以导入的类型

import可以导入的类型很多,包括:

.py源文件

.pyc字节码

.pyo 优化的字节码文件

文件目录

C/C++的动态库

C/C++的静态库

ZIP文件

内存镜像,比如Python的frozen package

Java class(Jython使用)

.NET(IronPython使用)

既然Python可以导入这么多文件,那么,如果在搜寻路径中同一个目录下,出现了b.py和b.pyc,那么,Python到底会使用哪一个文件呢?Python自己有一套选择标准,但是,这个标准可能随着Python实现的不同迭代版本而不同。

Python中的import语句的更多相关文章

  1. Python中from … import …语句

    from - import -语句可以让你从模块中导入一个指定的部分到当前模块

  2. 详解Python中的循环语句的用法

    一.简介 Python的条件和循环语句,决定了程序的控制流程,体现结构的多样性.须重要理解,if.while.for以及与它们相搭配的 else. elif.break.continue和pass语句 ...

  3. 一文了解Python中的判断语句

    判断(if)语句 目标 开发中的应用场景 if 语句体验 if 语句进阶 综合应用 01. 开发中的应用场景 生活中的判断几乎是无所不在的,我们每天都在做各种各样的选择,如果这样?如果那样?…… 程序 ...

  4. python中的import,reload,以及__import__

    python中的import,reload,以及__import__ 分类: UNIX/LINUX C/C++LINUX/UNIX shellpython2013-04-24 20:294536人阅读 ...

  5. Python中表达式和语句及for、while循环练习

    Python中表达式和语句及for.while循环练习 1)表达式 常用的表达式操作符: x + y, x - y x * y, x / y, x // y, x % y 逻辑运算: x or y, ...

  6. Python教程:Python中的for 语句

    Python 中的 for 语句与你在 C 或 Pascal 中可能用到的有所不同. Python教程 中的 for 语句并不总是对算术递增的数值进行迭代(如同 Pascal),或是给予用户定义迭代步 ...

  7. 归纳整理Python中的控制流语句的知识点

    归纳整理Python中的控制流语句的知识点 Python 解释器在其最简单的级别,以类似的方式操作,即从程序的顶端开始,然后一行一行地顺序执行程序语句.例如,清单 1 展示了几个简单的语句.当把它们键 ...

  8. Python中的基本语句

    本文简单的介绍下Python的几个基本语句. print语句 print可同时打印多个表达式,只要将他们用逗号隔开. >>> name='Gumy' >>> gre ...

  9. Python 模块化 from .. import 语句介绍 (二)

    from语句 例一. from pathlib import Path,PosixPath print(dir()) print(Path) print(PosixPath) 运行结果: ['Path ...

随机推荐

  1. Linux通过Shell脚本命令修改密码不需要交互

    交互方式修改密码 1. ssh 远程到主机: 2. 切换到root账号: [一般都是切换到root进行密码修改,如果普通用户修改自己的密码,要输入原密码,然后新密码要满足复杂度才OK]: 3. pas ...

  2. rem和em的用法

    1.rem转化为向素值的方法 rem单位转化为像素大小取决于根元素的字体大小,即HTML元素的字体大小,根元素字体大小乘以rem. 例:根元素的字体大小 16px,10rem 将等同于 160px,即 ...

  3. ASP.NET Core学习网站推荐

    跟大家推荐一个不错的学习.NET Core 的网站,这个网站的视频是付费的,但是录视频的都是.NET Core的大佬们,个人觉得很不错推荐出来 video.jessetalk.cn

  4. 使用PHPExcel 对表格进行,读取和写入的操作。。。。

    下面的代码是使用PHPExcel 对多个表格数据进行读取, 然后整合的写入新的表格的方法!!!代码有点粗糙 , 多多保函!!! 这里有些地方注意下,如果你的表格数据过大, 一定要记得修改php.ini ...

  5. php 算法(二分法)只适用于有序表,且限于顺序存储结构

    function demo($array,$low,$high,$k){ if($low<=$high){//判断该数组是否存在 $mid =  intval(($low+$high)/2 ); ...

  6. 学习新框架laravel4 第三天

    请求与输入 获取请求参数 如果没有传递默认值位1 $id= Input::get('id',1); //获取所有请求内容 Input::all() 取得请求 URI $uri = Request::p ...

  7. 7、Linux应用程序地址布局

    程序构成 在学习Linux应用程序开发时,经常会遇到如下概念: 代码段.数据段.BSS段(Block Started by Symbol,又名:未始化数据段) .堆(heap)和栈(stack).始化 ...

  8. Qt——styleSheet

    1.两个地方调用 QWidget::setStyleSheet() QApplication::setStyleSheet() 2.基本语法 selector {attribute : value} ...

  9. RMI入门HelloWorld

    java RMI(Remote Method Invocation)是一种基于java远程调用技术,是对RPC的java实现,可以在不同主机上进行通信与方法调用.PRC通信原理如图: 方法调用从客户对 ...

  10. E. Almost Regular Bracket Sequence

    题目链接:http://codeforces.com/contest/1095/problem/E 解题心得: 刚开始拿到这个题的时候还真的没什么思路,后来仔细想想还是比较简单的.首先题目要求翻转一个 ...