按文件名加载 python 脚本源进行测试

Loading a python script source by filename for testing

我想为名为 foo-bar 的 python 3.7+ script 创建一个测试(这是文件名,它没有 .py 扩展名):

#!/usr/bin/env python

def foo(bar):
  return bar + 42

if __name__ == '__main__':
    print(foo(1))

如何单独通过路径加载这个文件,以便测试foo()方法?测试不应触发 if main 条件。

UPDATE 请注意,这与 executing 测试文件(即 exec('foo-bar'))无关,而是 loading/importing 作为a module/resource,允许测试代码在其上执行foo()

我认为,您可以做的是临时创建扩展名为. py 并在导入后将其删除

您可以使用 importlib 中的函数直接从脚本文件加载此模块,无需 .py 扩展名。

要使其正常工作,您需要明确使用加载程序,在这种情况下 SourceFileLoader 将正常工作。

from importlib.machinery import SourceFileLoader

foo_bar = SourceFileLoader('foo_bar', './foo-bar').load_module()

此时,您可以使用模块内部的函数:

result = foo_bar.foo(1)
assert result == 43