3

我继承了一些我需要返工的代码,因为它使用了已弃用的 imp 模块而不是 importlib

为了测试功能,我创建了一个简单的测试脚本:

# test.py
def main():
    print("main()")


if __name__ == "__main__":
    print("__main__")
    main()

当我用旧代码运行它时(下面是一个最小的例子)

# original imp based minimal example
import imp
import os
import site

script = r"./test.py"
script_dir = os.path.dirname(script)
script_name = os.path.splitext(os.path.basename(script))[0]

site.addsitedir(script_dir)

fp, pathname, description = imp.find_module(script_name, [script_dir])
imp.load_source('__main__', pathname, fp)

将输出以下内容:

__main__
main()

现在我在使用 importlib 模块逐字模仿时遇到了一些麻烦,因为我没有使用以下代码获得上述输出:

# my try so far using importlib
import importlib
import os
import site

script = os.path.abspath(r"./test.py")
script_dir = os.path.dirname(script)
script_name = os.path.splitext(os.path.basename(script))[0]

site.addsitedir(script_dir)

spec = importlib.util.spec_from_file_location(script_name, script)
module = importlib.util.module_from_spec(spec)
sys.modules[script_name] = module
spec.loader.exec_module(module)

相反,它什么也不输出。:-( 有关如何使用 importlib 模仿旧(imp)行为的任何建议?

4

1 回答 1

0

SourceFileLoader 似乎可以满足您的需求:

from importlib.machinery import SourceFileLoader

script_path = os.path.abspath(r"./test.py")
foo = SourceFileLoader("my_script", script_path).load_module()
foo.do_stuff()
于 2022-02-17T23:47:10.627 回答