You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

os.chdir()后如何获取Python脚本源文件的完整路径?

解决PyUnit测试切换目录后获取脚本所在路径的问题

嘿,我完全懂你碰到的这个麻烦——在PyUnit测试里用os.chdir()切换到临时目录后,原本用来获取脚本路径的方法因为工作目录变了就失效了。你之前尝试的inspect相关方法出问题,核心原因是切换目录后,路径解析的基准变了,导致拿到的是临时目录下的错误路径。

给你几个靠谱的解决方案:

方法1:用__file__变量(最简单可靠)

Python在执行脚本时,__file__会自动存储当前脚本的路径(可能是相对或绝对路径),而且这个路径不受后续os.chdir()的影响,直接用它处理就行:

import os

# 拿到脚本的绝对路径
script_full_path = os.path.abspath(__file__)
# 提取脚本所在的目录
script_dir = os.path.dirname(script_full_path)
# 现在就能轻松获取同级文件的路径了
sibling_file = os.path.join(script_dir, "你的同级文件名.ext")

这个方法是最推荐的,简单直接,还不会有内存泄漏之类的顾虑。

方法2:修正inspect的用法(如果一定要用inspect)

如果你坚持要用inspect模块,得注意os.path.abspath()会受当前工作目录影响,所以得换用os.path.realpath()来解析真实路径,另外记得清理帧引用避免内存泄漏:

import os
import inspect

frame = inspect.currentframe()
try:
    # 获取当前执行帧对应的文件路径
    file_name = inspect.getfile(frame)
    # 用realpath解析出不受工作目录影响的绝对路径
    script_full_path = os.path.realpath(file_name)
    script_dir = os.path.dirname(script_full_path)
finally:
    # 必须删除帧引用,防止内存泄漏
    del frame

# 拼接同级文件路径
sibling_file = os.path.join(script_dir, "你的同级文件名.ext")

为啥之前的方法不行?

你之前用os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))得到错误路径,是因为:

  • 当你切换到临时目录后,os.path.abspath()会以临时目录为基准,去拼接inspect.getfile()返回的文件名(如果是相对路径的话),结果自然就变成了临时目录下的路径,而不是脚本真正所在的目录。
  • 而__file__或者os.path.realpath()是直接基于脚本的原始位置解析的,完全不受工作目录变化的干扰。

另外提个小建议:在PyUnit测试里处理临时文件的话,也可以试试tempfile模块的上下文管理器,这样不用手动切换目录,能从根源上避免这类路径问题哦!

内容的提问来源于stack exchange,提问作者Ray Salemi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:59:13