在Python中如何获取脚本所在的目录?

2025-07-23 16:36:00 6 分享链接 开发笔记 python

这段代码 base_path = os.path.dirname(os.path.abspath(__file__)) 的作用是获取当前 Python 脚本所在的绝对路径目录路径。下面为你详细解释:

分步拆解

  1. __file__:这是 Python 中的一个内置变量,它代表的是当前正在执行的脚本文件的相对路径(如果脚本是被作为模块导入的,那么它就是模块文件的路径)。

    • 比如,当你的脚本位于 /home/user/project/mp3.py,并且是直接运行这个脚本时,__file__ 可能就是 mp3.py(相对路径形式),也可能是 ./mp3.py 或者其他相对形式,这取决于脚本的调用方式。
  2. os.path.abspath(__file__)os.path.abspath() 函数的功能是将相对路径转换为绝对路径

    • 假设当前工作目录是 /home/user/project,那么 os.path.abspath('mp3.py') 会返回 /home/user/project/mp3.py
  3. os.path.dirname(...)os.path.dirname() 函数会返回文件路径中的目录部分,也就是去掉文件名后的路径。

    • 对于 /home/user/project/mp3.pyos.path.dirname() 会返回 /home/user/project

为什么要这样写?

在实际的编程场景中,经常需要获取脚本所在的目录,然后基于这个目录来定位其他相关文件(如配置文件、资源文件等)。使用 os.path.dirname(os.path.abspath(__file__)) 可以确保无论脚本是从哪个目录被调用的,都能准确地获取到脚本自身所在的目录。

示例说明

假设你的项目结构如下:

my_project/
├── main.py
├── mp3.py
└── resources/
    └── config.txt

mp3.py 中,你可以这样获取 resources/config.txt 的路径:

import os

# 获取 mp3.py 所在的目录(即 my_project/)
base_path = os.path.dirname(os.path.abspath(__file__))

# 构建配置文件的路径
config_path = os.path.join(base_path, "resources", "config.txt")

# 现在可以使用 config_path 来读取配置文件
with open(config_path, 'r') as f:
    data = f.read()

注意事项

  1. 交互式环境中的差异:当你在 Python 交互式环境(如 IDLE、Jupyter Notebook)中使用 __file__ 时,这个变量是未定义的,因为此时并没有一个实际的脚本文件。在这种情况下,执行这段代码会抛出 NameError 异常。
  2. 打包后的 EXE 文件:当使用 PyInstaller 等工具将脚本打包成 EXE 文件后,__file__ 的行为会发生变化。此时应该使用 sys._MEIPASS 来获取临时目录的路径,就像我们之前讨论的那样。

在Python中如何获取脚本所在的目录?