原来如此:Python居然有6种模块路径搜索方式

liftword1周前 (06-24)技术文章6

点赞、收藏、加关注,下次找我不迷路

当我们使用import语句导入模块时,Python 是怎么找到这些模块的呢?今天我就带大家深入了解 Python 的 6 种模块路径搜索方式。


一、Python 模块路径搜索的重要性

在实际开发中,我们经常会用到各种第三方库,比如处理数据的pandas,进行网络请求的requests,还有做数据分析的numpy等等。如果 Python 找不到这些模块,我们的代码就无法正常运行,就好像你想用一个工具,却怎么也找不到它放在哪里,那多着急啊!所以,了解模块路径搜索方式,是我们写好 Python 代码的重要基础。


二、Python 模块路径搜索的 6 种方式

1. 内置模块搜索

Python 有很多内置模块,这些模块就像是 Python 自带的 “基础工具包”,不需要额外安装,随时都能使用。比如os模块,它提供了许多与操作系统交互的功能;math模块,包含了各种数学运算函数。当我们使用import os或import math时,Python 会优先在内置模块列表中查找。我认为这就好比你在一个工具房里,最常用的工具都会放在最显眼、最容易拿到的地方,Python 的内置模块也是这样,被放在了搜索的首位。

2. 当前工作目录搜索

如果导入的不是内置模块,Python 接下来会在当前工作目录中查找。当前工作目录是什么呢?简单来说,就是你运行 Python 脚本时所在的文件夹。我举个例子,假如你在D:\python_projects\my_project文件夹下有一个main.py文件,在这个文件里你想要导入一个自定义的my_module.py模块,如果my_module.py也在D:\python_projects\my_project这个文件夹里,Python 就能顺利找到它。

我们可以通过以下代码查看当前工作目录:

import os
print(os.getcwd())

运行这段代码,就能打印出当前的工作目录路径。

3. PYTHONPATH 环境变量指定的路径搜索

除了当前工作目录,我们还可以通过设置PYTHONPATH环境变量,告诉 Python 去其他路径查找模块。我觉得这就像是给 Python 画了一张路线图,让它按照我们指定的路线去寻找模块。

在 Windows 系统中,设置PYTHONPATH环境变量的步骤如下:

  1. 右键点击 “此电脑”,选择 “属性”。
  1. 在弹出的窗口中,点击 “高级系统设置”。
  1. 在 “系统属性” 窗口的 “高级” 选项卡中,点击 “环境变量” 按钮。
  1. 在 “系统变量” 部分,找到 “Path” 变量,点击 “编辑”。
  1. 点击 “新建”,然后输入你想要添加的模块搜索路径,比如D:\python_modules。
  1. 依次点击 “确定” 保存设置。

在 Linux 或 macOS 系统中,可以通过编辑.bashrc或.bash_profile文件来设置PYTHONPATH,在文件末尾添加如下内容:

export PYTHONPATH=$PYTHONPATH:/home/user/python_modules

其中/home/user/python_modules是你指定的模块路径,保存文件后,执行source ~/.bashrc或source ~/.bash_profile使设置生效。

设置好PYTHONPATH后,Python 就会在这些指定的路径中搜索模块。

4. 标准库路径搜索

Python 安装完成后,会有一个存放标准库的目录。标准库是 Python 官方提供的一系列模块,功能非常丰富,涵盖了文件处理、网络通信、数据处理等各个方面。Python 会在标准库路径中搜索模块。不同的操作系统,标准库的安装路径可能会有所不同,以下是常见操作系统中 Python 标准库的大致路径:

操作系统

标准库路径示例

Windows

C:\PythonXX\Lib(XX为 Python 版本号)

Linux

/usr/lib/pythonXX(XX为 Python 版本号)

macOS


/Library/Frameworks/Python.framework/Versions/XX/lib/pythonXX(XX为 Python 版本号)

当我们导入标准库中的模块时,Python 就会在这些路径中查找。

5. 第三方库安装路径搜索

我们平时使用的很多第三方库,比如pandas、requests等,在安装时都会被放置在特定的路径下。一般来说,使用pip安装的第三方库,会被安装在 Python 的site-packages目录中。在 Windows 系统中,这个目录通常位于C:\PythonXX\Lib\site-packages;在 Linux 和 macOS 系统中,一般位于
/usr/local/lib/pythonXX/site-packages(XX为 Python 版本号) 。Python 会自动在site-packages目录中搜索第三方库模块。

我给大家举个例子,当我们使用pip install requests安装了requests库后,在 Python 代码中使用import requests,Python 就能在site-packages目录中找到requests模块并导入。

6. .pth文件指定的路径搜索

除了前面几种方式,我们还可以通过.pth文件来指定模块搜索路径。.pth文件其实就是一个纯文本文件,里面每一行写一个路径,Python 会读取这些路径,并将其添加到模块搜索路径中。

我来演示一下具体的操作步骤:

  1. 在 Python 的site-packages目录下(前面提到的第三方库安装目录),新建一个文本文件,比如my_paths.pth。
  1. 用文本编辑器打开my_paths.pth文件,在里面写入你想要添加的模块路径,比如D:\my_custom_modules,保存文件。
  1. 之后,Python 在搜索模块时,就会包含D:\my_custom_modules这个路径了。

三、如何验证模块路径搜索顺序

为了更直观地了解 Python 模块路径搜索的顺序,我们可以通过sys.path来查看。sys.path是一个包含了 Python 模块搜索路径的列表,Python 会按照这个列表中的顺序依次搜索模块。

以下是查看sys.path的代码:

import sys
print(sys.path)

运行这段代码,你会看到类似这样的输出:

['', 'C:\\Python39\\python39.zip', 'C:\\Python39\\DLLs', 'C:\\Python39\\lib', 'C:\\Python39', 'C:\\Python39\\lib\\site-packages']

列表中的第一个元素''代表当前工作目录,后面依次是 Python 的一些内置路径和第三方库路径等。通过查看sys.path,我们就能清楚地知道 Python 会按照怎样的顺序去搜索模块了。


四、常见问题

1. 模块找不到的问题

有时候我们会遇到ModuleNotFoundError错误,提示找不到模块。这很可能是因为模块不在 Python 的搜索路径中。如果是自定义模块,你可以检查一下模块是否在当前工作目录,或者是否设置了正确的PYTHONPATH环境变量;如果是第三方库,确认一下是否已经正确安装,以及安装路径是否在sys.path中。

2. 模块冲突的问题

当不同路径下存在同名模块时,可能会出现模块冲突。Python 会按照sys.path的顺序,优先导入先找到的模块。如果遇到这种情况,你可以调整sys.path的顺序,或者修改模块名称来避免冲突。


以上详细梳理了 Python 的模块路径搜索方式。若你对内容深度、案例类型还有想法,或是想补充其他 Python 技巧内容,欢迎评论区留言。

相关文章

常用的Python库安装方法(Python实用教程)

Python应用场景比较多,但是要实现众多的功能,也是需要安装各种功能对应的库和插件的。在此,分享个人尝试用过的Python库安装方法和教程如下图所示,在PyCharm的控制台下,或者通过CMD命令切...

python基础—pip指定包安装目录

pip 指定某个路径安装包场景:有的时候我们安装了annconda环境,有很多的python环境,比如py36, py37, py27。此时,我们使用pip安装包的时候,经常可能安装在一个不知道的路径...

python import 出现 ModuleNotFoundError 解决方法

错误的原因是你的 Python 环境没有正确安装 库文件。本文以Scapy为例,给出详细方案:1. 确认是否成功安装 Scapy运行以下命令检查 Scapy 是否已安装:pip3 list | gre...

安装python后这几个目录很重要

各位网友好,关于拍摄环境之前有视频安装已经做过介绍了,安装完拍摄环境之后初学者经常有在运行过程当中的会遇到的问题,为了快速的去排查gatson环境的问题,了解python安装之后的一些关键目录以及主要...

从0开始学Python你准备好了吗?第一章·第三课 python的安装!

今天来正式在电脑上安装我们的Python工具的安装!首先我们来说需要用到的工具!1、我们使用python来写代码,首先要用的就是写代码的工具,这里常用的有两款,请看下图以上是两款Python都可以用的...