Python脚本绝对路径解析问题:find命令执行时相对路径错误
解决find执行子目录Python脚本时相对路径错误的问题
这个问题我碰到过好几次了——当你用find从父目录批量执行子文件夹里的Python脚本时,脚本里的相对路径会以你运行find的目录为基准,而不是脚本本身所在的目录,自然就找不到资源了。下面给你两种靠谱的解决办法:
方法1:用find执行时先切换到脚本所在目录
不需要修改任何脚本,只需要调整find的命令,通过sh -c先切换到脚本的目录再执行:
find . -name "process.py" -type f -exec sh -c 'cd "$(dirname "$1")" && python3 "$1"' _ {} \;
解释一下这个命令:
$(dirname "$1")会提取出process.py文件所在的目录路径cd到这个目录后再运行脚本,此时脚本里的../data就会相对于它自己的目录解析,和你单独在脚本目录执行的效果完全一样- 开头的
_是sh -c的占位符,用来填充$0的位置,确保$1能正确对应find传过来的脚本路径{}
方法2:修改Python脚本,让它自己定位资源路径
如果希望脚本不管在什么位置执行都能正确找到资源,推荐修改脚本本身,让它基于自身的位置构建绝对路径。在脚本里加入这段代码:
import os # 获取当前脚本的绝对路径所在目录 script_dir = os.path.dirname(os.path.abspath(__file__)) # 构建data目录的路径(对应你原来的../data) data_dir = os.path.normpath(os.path.join(script_dir, '../data'))
之后脚本里所有用到../data的地方,都替换成这个data_dir变量就行。os.path.normpath会自动把路径里的../这类相对路径转换成规范的绝对路径,避免解析错误。
两种方法怎么选?
- 如果只是临时批量执行脚本,用方法1更快捷,不用改代码
- 如果脚本需要长期在不同环境下执行,方法2更健壮,一劳永逸
内容的提问来源于stack exchange,提问作者S.aad
相关产品推荐
相关产品推荐

