我想在
.git/hooks/pre-commit
中的预提交挂钩中导入并测试模块。其结构为:
set_prefix.py 温度.py .git |----挂钩 |----预提交
文件
set_prefix.py
可以简单地是:
def main():
pass
文件
temp.py
是:
import set_prefix
调用
python3 temp.py
不会引发任何错误。
对于
.git/hooks/pre-commit
,我用import os; print(os.getcwd())
确认工作目录与set_prefix.py
相同。
以下导入失败:
import set_prefix
失败并显示 ModuleNotFoundError: No module named 'set_prefix'
from . import set_prefix
失败并显示 ImportError: attempted relative import with no known parent package
(可能是因为 它不是包的一部分)。一个有效的导入,来自[这个线程],(如何导入上面目录中的Python类?)需要在运行时添加到路径:
import sys
sys.path.append(".") # Adds current directory to python modules path.
from . import set_prefix
如果同一目录上的文件和预提交挂钩在运行时都具有相同的当前目录,为什么导入行为会有所不同?
评论中提到的另一个解决方案是将目录转换为带有
__init__.py
文件的包。但我仍然不明白为什么导入可以从 temp.py
进行,而不是从预提交挂钩(如果它们都从同一目录运行)。
预提交挂钩创建一个环境,其中仅包含更改的文件(通过
files
选项的正则表达式过滤后的文件)以使预提交检查快速。set_prefix.py
文件需要进行更改才能将其添加到预提交环境中。因此,在运行预提交挂钩时找不到该文件,但在测试正常运行时它可以工作。