python导入的模块搜索顺序详解(python import搜寻模块的机制详解)

2024-02-24 18:30

本文主要是介绍python导入的模块搜索顺序详解(python import搜寻模块的机制详解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:本文会以windows和Linux两个平台之下进行说明,python的模块导入的搜索顺序是怎样的。

一、导入模块的搜索顺序:

(1)首先导入内建模块。首先判断这个module是不是built-in即内建模块,如果是内建模块则引入内建模块,如果不是则在一个称为sys.path的list中寻找;

(2)在sys.path返回的列表中寻找。sys.path在python脚本执行时动态生成,它返回的是一个列表,这个列表包含了以下几部分。包括以下5个部分:

下面的五个搜索路径是有先后顺序的哦!!!

  • 程序的根目录(即当前运行python文件的目录)
  • PYTHONPATH环境变量设置的目录
  • 标准库的目录
  • 任何能够找到的.pth文件的内容
  • 第三方扩展的site-package目录

因为内建模块是随着解释器一起的,不用自己管,我们只需要查看sys.path这个顺序即可。

1.1 windows平台之下

在这个示例中,我是用的是anaconda环境,在环境之下创建了一个pytorch1.2.0的新环境, 执行如下:

import sys
sys.path
'''返回的列表为:
['',   # 运行程序的根目录'D:\\ProgramData\\Anaconda3\\envs\\pytorch1.2.0\\python36.zip', # 这几个是python标准库目录'D:\\ProgramData\\Anaconda3\\envs\\pytorch1.2.0\\DLLs', 'D:\\ProgramData\\Anaconda3\\envs\\pytorch1.2.0\\lib', 'D:\\ProgramData\\Anaconda3\\envs\\pytorch1.2.0', 'C:\\Users\\Administrator\\AppData\\Roaming\\Python\\Python36\\site-packages', 'D:\\ProgramData\\Anaconda3\\envs\\pytorch1.2.0\\lib\\site-packages'  # 最后面这个是第三方模块所在的目录
]'''
'''
# 注意:这里是没有设置PYTHONPATH 环境变量的路径值的,也没有创建.pth文件
'''

(1)关于环境变量PYTHONPATH

PYTHONPATH 这个目录是可配置的),python会搜索PYTHONPATH环境变量里列出的所有目录,因为这个搜索在标准库之前,所以要小心不要覆盖一些标准库的同名模块。 

(2)什么是*.pth文件

问题一:什么是 *.pth文件?

路径配置文件的扩展名是”.pth”,它的作用是在该文件中放置一些列需要让python解释器查找的路径。

问题二:*.pth文件放在哪里?

Python 在遍历已知的库文件目录过程中(在遍历sys.path的路径的过程中要能够找得到才行哦!!!),如果见到一个* .pth 文件,就会将文件中所记录的路径加入到 sys.path 设置中,于是 .pth 文件所指明的库也就可以被 Python 运行环境找到了。所以这个文件不是乱放的,不要能够被解释器找得到的地方才行。

当然在上面的打印出来的sys.path里面的那些路径里面都可以放置,因为那些路径解释器都能够找得到,但是一般为了方便管理,我们放置在下面两个位置之一:

import site
site.getsitepackages()
'''
['D:\\ProgramData\\Anaconda3\\envs\\pytorch1.2.0',  # python的根目录'D:\\ProgramData\\Anaconda3\\envs\\pytorch1.2.0\\lib\\site-packages']  #python的第三方库目录
'''

问题三:*.pth文件里面内容怎么写?

*.pth文件里面放置的其实就是几个目录。其中的每一行包含一个单独的路径,该路径会添加到sys.path列表中,”.pth”中的路径既可以是绝对路径,也可以是相对路径,如果是相对路径,则是相对于包含”.pth”文件的路径而言的。

比如我自己在 D:\ProgramData\Anaconda3\envs\pytorch1.2.0 

这个目录之下新建一个文本文档,然后在里面放入一个目录,  F:/pytorch

然后将文件后缀.txt改为 .pth 

现在我再次查看sys.path得到如下结果:

>>> import sys
>>> sys.path
'''
['', 'D:\\ProgramData\\Anaconda3\\envs\\pytorch1.2.0\\python36.zip', 'D:\\ProgramData\\Anaconda3\\envs\\pytorch1.2.0\\DLLs', 'D:\\ProgramData\\Anaconda3\\envs\\pytorch1.2.0\\lib', 'D:\\ProgramData\\Anaconda3\\envs\\pytorch1.2.0', 'C:\\Users\\Administrator\\AppData\\Roaming\\Python\\Python36\\site-packages', 'F:\\pytorch',             # 这就是新添加进来的路径,而且他在第三方库之前哦'D:\\ProgramData\\Anaconda3\\envs\\pytorch1.2.0\\lib\\site-packages'
]
'''

1.2 Linux平台之下

同样的操作,先查看sys.path所返回的路径有哪一些

>>> import sys
>>> sys.path
'''
['',   # 当前目录'/usr/local/python3/lib/python36.zip',  # python标准库目录'/usr/local/python3/lib/python3.6', '/usr/local/python3/lib/python3.6/lib-dynload', '/usr/local/python3/lib/python3.6/site-packages' # 第三方库所在的目录
]
'''

另外我们看一下使用site模块的情况:

import site
site.getsitepackages()
'''
['/usr/local/python3/lib/python3.6/site-packages']
'''

我们发现这虽然和window上有一些区别所在,其实原理都是一样的,这里就不再重复试验了。

1.3 在代码中手动添加搜索路径到sys.path所返回的列表中

既然前面说过sys.path返回的是一个列表,而且这个列表是动态执行的时候确定的,所以我们可以在编写代码的时候在代码最前面添加某一些需要的搜索路径到sys.path里面如下:

import sys
sys.path.append("F:/my_own_path")

但是我们一般不太推荐这样做!!!

 

总结:

python搜索模块的顺序为如下:

内建模块 >

程序的根目录(即当前运行python文件的目录)>

PYTHONPATH环境变量设置的目录>

标准库的目录>

任何能够找到的*.pth文件的内容>

第三方扩展的site-package目录

这篇关于python导入的模块搜索顺序详解(python import搜寻模块的机制详解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/742976

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学