用 importlib 替换 imp 以保持旧行为?
Replacing imp with importlib maintaining old behavior?
我继承了一些需要返工的代码,因为它使用的是已弃用的 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) 行为有什么建议吗?
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()
像下面这样解决了
if sys.version_info[0] == 3:
if sys.version_info[1] >= 5:
import importlib.util
spec = importlib.util.spec_from_file_location(module_name, module_path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
elif sys.version_info[1] < 5:
import importlib.machinery
loader = importlib.machinery.SourceFileLoader(module_name, module_path)
loader.load_module()
elif sys.version_info[0] == 2:
import imp
imp.load_source(module_name, module_path)
我继承了一些需要返工的代码,因为它使用的是已弃用的 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) 行为有什么建议吗?
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()
if sys.version_info[0] == 3:
if sys.version_info[1] >= 5:
import importlib.util
spec = importlib.util.spec_from_file_location(module_name, module_path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
elif sys.version_info[1] < 5:
import importlib.machinery
loader = importlib.machinery.SourceFileLoader(module_name, module_path)
loader.load_module()
elif sys.version_info[0] == 2:
import imp
imp.load_source(module_name, module_path)