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
相关产品推荐
相关产品推荐

