介绍
在 Python 编程的世界中,理解和管理系统路径对于定位和使用必要的模块至关重要。本教程将指导你完成检查 Python 系统路径的过程,以及修改它以确保你的项目可以访问所需的依赖项。
在 Python 编程的世界中,理解和管理系统路径对于定位和使用必要的模块至关重要。本教程将指导你完成检查 Python 系统路径的过程,以及修改它以确保你的项目可以访问所需的依赖项。
Python 路径,也称为 sys.path,是 Python 在尝试导入模块时搜索的目录列表。这是一个需要理解的重要概念,因为它决定了当你运行代码时,Python 将在何处查找必要的模块和包(package)。
Python 路径是 Python 在尝试导入模块时搜索的目录列表。当你在 Python 代码中导入一个模块时,Python 会在 sys.path 列表中指定的目录中查找该模块。
sys.path 列表通常包括以下目录:
PYTHONPATH 环境变量(如果已设置)你可以通过在 Python 代码中使用 sys.path 属性来查看当前的 Python 路径。让我们创建一个简单的 Python 脚本来看看实际效果。
打开 WebIDE 终端,如果尚未进入你的项目目录,请导航到该目录。默认目录是 /home/labex/project。
现在,使用 WebIDE 编辑器在 /home/labex/project 目录中创建一个名为 check_path.py 的新文件。
将以下代码添加到 check_path.py 文件中:
import sys
print(sys.path)
保存文件。
现在,从终端运行脚本:
python check_path.py

你将看到类似于以下的输出:
['/home/labex/project', '/usr/lib/python310.zip', '/usr/lib/python3.10', '/usr/lib/python3.10/lib-dynload', '/home/labex/.local/lib/python3.10/site-packages', '/usr/local/lib/python3.10/dist-packages', '/usr/lib/python3/dist-packages']
此输出显示了当你运行脚本时 Python 搜索的目录列表。第一个条目是脚本所在的目录 (/home/labex/project)。其他条目是标准的 Python 库和 site-package 目录。
Python 路径的结构是一个目录列表。列表中的每个目录代表 Python 将搜索模块和包的位置。列表中目录的顺序很重要,因为 Python 将按照它们在列表中出现的顺序搜索目录。
例如,如果你有一个自定义模块位于 /path/to/my/module 目录中,并且你想在你的 Python 代码中导入该模块,你需要确保 /path/to/my/module 目录包含在 Python 路径中。
在上图中,Python 脚本正在尝试导入一个模块,并且 sys.path 列表包含 Python 将在其中搜索该模块的几个目录。
site 模块检查 Python 路径在上一步中,你使用了 sys.path 来查看 Python 搜索的目录。另一个有用的模块,可以帮助你理解 Python 在哪里查找包(package),特别是 site-packages(通过 pip 安装的第三方包),是 site 模块。
site.getsitepackages() 函数返回一个列表,其中包含 Python 将在其中搜索 site-packages 的目录。
让我们修改 check_path.py 脚本,以便也使用 site 模块。
在 WebIDE 编辑器中打开 check_path.py 文件。
在现有代码之后,将以下行添加到脚本中:
import site
print("\nsite.getsitepackages():")
print(site.getsitepackages())
完整的 check_path.py 文件现在应如下所示:
import sys
import site
print("sys.path:")
print(sys.path)
print("\nsite.getsitepackages():")
print(site.getsitepackages())
保存文件。
现在,再次从终端运行脚本:
python check_path.py
你将看到类似于以下的输出:
sys.path:
['/home/labex/project', '/usr/lib/python310.zip', '/usr/lib/python3.10', '/usr/lib/python3.10/lib-dynload', '/home/labex/.local/lib/python3.10/site-packages', '/usr/local/lib/python3.10/dist-packages', '/usr/lib/python3/dist-packages']
site.getsitepackages():
['/home/labex/.local/lib/python3.10/site-packages', '/usr/local/lib/python3.10/dist-packages', '/usr/lib/python3/dist-packages']
请注意,site.getsitepackages() 的输出是 sys.path 中目录的子集。 site.getsitepackages() 专门显示了通常安装第三方包的位置。
通过同时使用 sys.path 和 site.getsitepackages(),你可以更全面地了解 Python 在你的系统上搜索模块和包的位置。
在某些情况下,你可能需要为特定的脚本或会话将目录添加到 Python 路径。当你正在开发自定义模块或使用未安装在标准 Python 路径中的模块时,这非常有用。
你可以通过使用 sys.path.append() 在正在运行的脚本中临时修改 Python 路径。
让我们创建一个新目录并在其中创建一个简单的模块来演示这一点。
在终端中,在你的项目目录中创建一个名为 my_custom_modules 的新目录:
mkdir /home/labex/project/my_custom_modules
现在,使用 WebIDE 编辑器在 my_custom_modules 目录中创建一个名为 my_module.py 的新文件。
将以下代码添加到 my_module.py:
def greet(name):
return f"Hello, {name} from my_module!"
保存文件。
接下来,在 /home/labex/project 目录中创建一个名为 use_custom_module.py 的新 Python 脚本。
将以下代码添加到 use_custom_module.py:
import sys
import os
## Get the absolute path to the custom modules directory
custom_modules_path = os.path.join(os.path.dirname(__file__), 'my_custom_modules')
## Add the custom modules directory to sys.path
sys.path.append(custom_modules_path)
## Now you can import my_module
import my_module
message = my_module.greet("LabEx User")
print(message)
## Optional: Print sys.path again to see the added directory
print("\nUpdated sys.path:")
print(sys.path)
保存文件。
在此脚本中,我们首先使用 os.path.join 和 os.path.dirname(__file__) 构造 my_custom_modules 目录的绝对路径。这使得脚本更具可移植性。然后,我们使用 sys.path.append() 将此目录添加到 Python 路径。添加目录后,我们可以成功导入 my_module。
从终端运行脚本:
python use_custom_module.py
你应该看到类似于以下的输出:
Hello, LabEx User from my_module!
Updated sys.path:
['/home/labex/project', '/usr/lib/python310.zip', '/usr/lib/python3.10', '/usr/lib/python3.10/lib-dynload', '/home/labex/.local/lib/python3.10/site-packages', '/usr/local/lib/python3.10/dist-packages', '/usr/lib/python3/dist-packages', '/home/labex/project/my_custom_modules']
输出显示 my_module 中的 greet 函数已成功调用,并且 my_custom_modules 目录已添加到此脚本执行的 sys.path 中。
这种修改 sys.path 的方法是临时的,仅影响当前脚本的执行。
虽然在脚本中修改 sys.path 对于临时更改很有用,但你可能希望为所有 Python 会话或特定项目将目录添加到 Python 路径,而无需修改单个脚本。这可以通过设置 PYTHONPATH 环境变量来实现。
PYTHONPATH 环境变量是一个目录列表,Python 启动时会将其添加到 sys.path 中。
要为当前终端会话设置 PYTHONPATH 环境变量,你可以使用 export 命令。
让我们从 use_custom_module.py 中删除 sys.path.append() 行,并改用 PYTHONPATH。
在 WebIDE 编辑器中打开 use_custom_module.py 并删除以下行:
## Get the absolute path to the custom modules directory
custom_modules_path = os.path.join(os.path.dirname(__file__), 'my_custom_modules')
## Add the custom modules directory to sys.path
sys.path.append(custom_modules_path)
use_custom_module.py 文件现在应如下所示:
import sys
import os
## Now you can import my_module
import my_module
message = my_module.greet("LabEx User")
print(message)
## Optional: Print sys.path again to see the added directory
print("\nUpdated sys.path:")
print(sys.path)
保存文件。
现在,尝试在不设置 PYTHONPATH 的情况下运行脚本:
python use_custom_module.py
你可能会收到 ModuleNotFoundError,因为 Python 找不到 my_module。
Traceback (most recent call last):
File "/home/labex/project/use_custom_module.py", line 5, in <module>
import my_module
ModuleNotFoundError: No module named 'my_module'
现在,让我们在终端中设置 PYTHONPATH 环境变量,以包含我们的自定义模块目录。确保你在 /home/labex/project 目录中。
export PYTHONPATH="/home/labex/project/my_custom_modules:$PYTHONPATH"
此命令将 /home/labex/project/my_custom_modules 添加到 PYTHONPATH 变量的开头。末尾的 $PYTHONPATH 确保保留 PYTHONPATH 中的任何现有目录。
现在,在同一终端会话中再次运行 use_custom_module.py 脚本:
python use_custom_module.py
你应该看到输出表明已找到并执行该模块:
Hello, LabEx User from my_module!
Updated sys.path:
['/home/labex/project', '/home/labex/project/my_custom_modules', '/usr/lib/python310.zip', '/usr/lib/python3.10', '/usr/lib/python3.10/lib-dynload', '/home/labex/.local/lib/python3.10/site-packages', '/usr/local/lib/python3.10/dist-packages', '/usr/lib/python3/dist-packages']
请注意,由于我们设置了 PYTHONPATH 环境变量,因此 /home/labex/project/my_custom_modules 现在包含在 sys.path 中。
使用 export 在终端中设置 PYTHONPATH 仅影响当前终端会话。要使更改永久生效,通常会将 export 命令添加到 shell 的启动文件(例如,~/.bashrc、~/.zshrc)。但是,对于这个实验(Lab),在当前会话中设置它足以演示这个概念。
在这个实验(Lab)中,你学习了如何检查和修改 Python 系统路径(sys.path)。你使用了 sys.path 和 site.getsitepackages() 来检查 Python 搜索模块的目录。你还学习了两种将目录添加到 Python 路径的方法:使用 sys.path.append() 在脚本中临时添加,以及使用 PYTHONPATH 环境变量为会话更持久地添加。理解和管理 Python 路径是组织 Python 项目并确保你的代码可以找到必要的模块和包的一项基本技能。