Windows下Git Hooks无法运行:Python模块导入失败排查
Git Hooks Python脚本在Windows导入模块失败的解决方案
这个问题我之前也碰到过!核心原因是Windows和Unix系统处理符号链接执行时的工作目录逻辑不一样:
- 在Unix(比如Mac)上,通过符号链接执行Python脚本时,Python会自动将符号链接指向的实际脚本所在目录加入
sys.path,所以你能顺利导入同目录的utils.py。 - 但在Windows上,Git执行钩子时的工作目录是
.git/hooks,而不是你的版本化钩子所在的git-hooks目录,导致utils.py的目录不在sys.path里,自然导入失败。
最靠谱的跨平台解决方案:动态添加脚本目录到sys.path
在你的pre-commit脚本开头,加入一段代码,自动解析当前脚本的实际路径(不管是符号链接还是原文件),并把该目录加入sys.path,这样就能跨平台解决导入问题:
#!/usr/bin/env python import sys import os # 获取当前脚本的实际物理路径(解析符号链接) script_real_path = os.path.realpath(__file__) # 提取脚本所在的目录 script_dir = os.path.dirname(script_real_path) # 将脚本目录加入sys.path的最前面,确保优先找到同目录的模块 sys.path.insert(0, script_dir) # 现在可以正常导入utils了 import utils # 后面写你的钩子逻辑...
为什么这个方法有效?
os.path.realpath(__file__)会自动解析符号链接,拿到git-hooks/pre-commit的实际路径,而不是.git/hooks/pre-commit这个符号链接的路径。- 把这个目录加入
sys.path后,Python就能找到同目录下的utils.py,不管在Windows还是Unix系统上,逻辑都是一致的。
额外验证小技巧
你可以在脚本里加一行打印sys.path的代码,确认路径是否正确:
print("Current sys.path:", sys.path)
执行提交后,在Windows上应该能看到你的git-hooks目录已经出现在sys.path列表里,这就说明路径已经正确添加了。
内容的提问来源于stack exchange,提问作者Ogen
相关产品推荐
相关产品推荐

