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

相关文章

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Redis 的 SUBSCRIBE命令详解

《Redis的SUBSCRIBE命令详解》Redis的SUBSCRIBE命令用于订阅一个或多个频道,以便接收发送到这些频道的消息,本文给大家介绍Redis的SUBSCRIBE命令,感兴趣的朋友跟随... 目录基本语法工作原理示例消息格式相关命令python 示例Redis 的 SUBSCRIBE 命令用于订