在预提交挂钩中导入模块需要添加运行时路径

问题描述 投票:0回答:1

我想在

.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
进行,而不是从预提交挂钩(如果它们都从同一目录运行)。

python git import module
1个回答
0
投票

预提交挂钩创建一个环境,其中仅包含更改的文件(通过

files
选项的正则表达式过滤后的文件)以使预提交检查快速。
您提到的
set_prefix.py
文件需要进行更改才能将其添加到预提交环境中。因此,在运行预提交挂钩时找不到该文件,但在测试正常运行时它可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.