python模块导入的细节详解

yizhihongxing

Python模块导入的细节详解

在 Python 中,一个模块是一个包含了 Python 定义和语句的文件。模块能够被别的程序引入,这样就可以使用模块中的函数,类和变量等资源。Python 模块的导入方式有三种:

  • import 模块名
  • import 模块名 as 别名
  • from 模块名 import 模块元素名

模块搜索路径

在模块导入时,Python 会从各种目录和位置去寻找模块,这些目录和位置被称为搜索路径(search path),Python 解释器根据搜索路径来定位模块文件,搜索路径按照如下顺序查找:

  1. 内置模块
  2. sys.path 变量指定的目录
  3. PYTHONPATH 环境变量指定的目录
  4. 默认目录和 PYTHONPATH 未定义时的兜底目录

模块导入机制

Python 会在内存中存储已经导入的模块,这是为了避免多次导入同一个模块,导致重复执行模块初始化代码。

当模块被导入时,Python 解释器会执行该模块的代码。而且这个且只有一次。如果在 Python 解释器退出以后再次导入该模块,解释器会直接加载内存缓存,避免再次执行模块代码。

从模块导入的角度来看,Python 中一个模块(.py 文件)就是一个名称空间(namespace)。在这个名称空间中,可以使用所有模块内的函数、变量和因素等。

示例一

下面的示例介绍了如何导入一个模块,并使用其中的函数和变量:

# 导入Python内置模块math
import math

# 导入math模块中的pi
from math import pi

# 使用math模块中的sqrt函数
print(math.sqrt(2))

# 使用math模块中常量pi
print(pi)

# 更改导入模块的名称,将math模块的别名设置为 m
import math as m
print(m.sqrt(2))

输出结果:

1.4142135623730951
3.141592653589793
1.4142135623730951

示例二

下面的示例演示模块搜索路径和模块缓存:

假设我们有一个模块 utils.py,内容如下:

# utils.py
NAME = "utils"

def get_name():
    return NAME

我们创建一个脚本 main.py,当中导入该模块两次:

# main.py
import sys
import os
import utils

sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
import utils

print(utils.get_name())

在模块导入路径搜索规则中,第一条是内置模块,不在搜索路径中。直接从 utils 模块文件中导入相应的模块。第二次导入时,该模块已经被缓存,直接从缓存中读取。

输出结果:

utils

结论

了解 Python 模块导入机制和模块搜索路径机制对于我们编写高质量代码是非常有帮助的。编写 Python 代码的时候,应该按照 Python 的模块导入约定以及模块搜索路径去编写并组织自己的 Python 代码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python模块导入的细节详解 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • 基于python的列表list和集合set操作

    基于Python的列表(List)和集合(Set)操作 Python中的列表(List)和集合(Set)是两种常用的数据类型,它们都可以用来存储多个元素。本文将入讲解Python中列表和集合的区别、创建、访问、修改、删除等操作,并提供两个示例说明。 列表(List)集合(Set)的区别 列表和集合的最大区别在于它们的元素是否唯一。列表中的元素可以重复,而集合…

    python 2023年5月13日
    00
  • 跟老齐学Python之坑爹的字符编码

    跟老齐学Python之坑爹的字符编码 什么是字符编码 字符编码(Character Encoding)是一种将字符集中的字符转换为二进制数据的过程,使得计算机能够识别和处理文本。在计算机中,所有的数据都是以二进制形式存储和处理的,因此文本数据也需要被转换为二进制数据表示。常见的字符编码包括ASCII、GB2312、UTF-8等。 坑爹的字符编码问题 在字符编…

    python 2023年5月20日
    00
  • Python 词典(Dict) 加载与保存示例

    接下来我将为你详细讲解 Python 词典(Dict) 加载与保存示例的完整攻略。 什么是 Python 词典(Dict)? Python 中的词典(Dict)是一种无序、可变的集合数据类型,用于存储以键-值对形式保存的数据。 以下是一种简单的词典示例: person = {‘name’: ‘Alice’, ‘age’: 25, ‘country’: ‘Ca…

    python 2023年5月13日
    00
  • Python使用list列表和tuple元组的方法

    Python使用list列表和tuple元组的方法 在Python中,List和Tuple是两种常用的数据类型,它们都可以用来存储多个元素。本文将深入讲解Python使用list列表和tuple元组方法,并提供两个示例说明。 创建List和Tuple 可以使用方括号来创建List,例如: my_list = [1, 2, 3, 4, 5] 可以使用圆括号来创…

    python 2023年5月13日
    00
  • 解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题

    解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题的攻略如下: 问题描述 在新版Pycharm中,Matplotlib画出的图像不再弹出独立的显示窗口而是在IDE右侧的Plot窗口中显示,这给我们的代码调试和展示带来了一些不便。我们需要解决这个问题。 解决步骤 第一步,我们需要对matplotlib的配置文件进行修改。在Pycharm…

    python 2023年5月18日
    00
  • Python 判断时间是否在时间区间内的实例

    下面是“Python 判断时间是否在时间区间内的实例”的完整攻略。 思路分析 判断一个时间点是否在时间区间内,需要用到 Python 的 datetime 模块。具体的思路是,将时间区间拆分成起始时间和截止时间,并将要判断的时间点转化为 datetime 对象,然后比较两个对象之间的大小关系即可。 代码实现 首先,我们需要引入 datetime 模块。 fr…

    python 2023年6月2日
    00
  • Django框架反向解析操作详解

    Django框架反向解析操作详解 在Django框架中,反向解析是指根据URL模式名称和参数生成URL的过程。本攻略将介绍Django框架中反向解析的操作,包括URL模式定义、反向解析函数、URL模式命名等。 步骤1:URL模式定义 在Django框架中,我们需要定义URL模式,以便反向解析生成URL。以下是URL模式定义的示例代码: from django…

    python 2023年5月15日
    00
  • Python查找多个字典公共键key的方法

    Python查找多个字典公共键key的方法可以使用集合交集的方法,具体步骤如下: 将所有字典的键值集合转换为一个列表,并使用Python内置的set()函数转换为集合,然后使用集合的交集函数&获取所有字典公共的键值。 利用列表解析式遍历字典列表,取出每个字典公共的键值对应的键值。 下面是使用Python代码实现的示例: #创建字典列表 dict_li…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部