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目录

  • 19
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
正则表达式是一种匹配文本的工具,可以用于搜索、替换和验证字符串。Python中内置了re模块,用于处理正则表达式。下面详细介绍Python中正则表达式的语法和用法。 1. 基本语法 正则表达式是由一系列字符和元字符组成的模式,用来描述字符串的特征。下面是一些基本的正则表达式元字符: - . 匹配任意字符 - [] 匹配中括号内任意一个字符 - ^ 匹配行首 - $ 匹配行尾 - * 匹配前面的字符0次或多次 - + 匹配前面的字符1次或多次 - ? 匹配前面的字符0次或1次 - {n} 匹配前面的字符n次 - {n,m} 匹配前面的字符n到m次 例如,正则表达式r'hello'可以匹配字符串中的hello字符串。 2. re模块的常用函数 re模块提供了一些常用的函数来处理正则表达式: - re.match() 函数从字符串的开头匹配正则表达式 - re.search() 函数在字符串中搜索正则表达式的第一次出现 - re.findall() 函数返回字符串中所有匹配正则表达式的子串列表 - re.sub() 函数用于将字符串中匹配正则表达式的子串替换为指定的字符串 例如,可以使用re.match()函数来匹配字符串开头的hello字符串: ``` import re s = 'hello world' if re.match(r'hello', s): print('Matched') else: print('Not matched') ``` 3. 分组和捕获 正则表达式支持使用小括号来分组和捕获匹配的子串。使用小括号括起来的正则表达式被称为捕获组,可以使用re.match()或re.search()函数返回的Match对象的group()方法获取捕获组匹配的子串。 例如,可以使用捕获组匹配字符串中的数字和字母: ``` import re s = '123abc456' m = re.search(r'(\d+)([a-z]+)(\d+)', s) if m: print(m.group(0)) # 123abc456 print(m.group(1)) # 123 print(m.group(2)) # abc print(m.group(3)) # 456 ``` 4. 零宽断言 零宽度断言是一种特殊的正则表达式,用于匹配字符串的位置,而不是字符。它可以匹配一个位置前面或后面的字符串,但不包括这个字符串本身。零宽度断言包括正向预测先行断言(positive lookahead assertion)、正向回顾后发断言(positive lookbehind assertion)、负向预测先行断言(negative lookahead assertion)和负向回顾后发断言(negative lookbehind assertion)。 例如,可以使用正向预测先行断言匹配一个字符串中的数字,但不包括小数点: ``` import re s = '123.456' m = re.search(r'\d+(?=\.)', s) if m: print(m.group()) # 123 ``` 5. Unicode支持 Python的re模块支持Unicode字符集,可以使用\p和\P进行匹配和排除Unicode字符集。例如,可以使用\p{Han}匹配汉字字符: ``` import re s = '汉字' m = re.search(r'\p{Han}+', s) if m: print(m.group()) # 汉字 ``` 6. 总结 正则表达式是一种强大的文本处理工具,可以用于搜索、替换和验证字符串。Python中内置了re模块,提供了处理正则表达式的函数和方法。正则表达式的语法和用法需要不断练习和实践才能熟练掌握。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值