使用inspect.getsource()加载源代码失败,原因是无法读取内置类。(不是)

2024-10-03 15:30:06 发布

您现在位置:Python中文网/ 问答频道 /正文

  • 当我直接从模块加载一个类的源代码时,这很好:

    import arg_master

    inspect.getsource(func)

  • 当我用spec_from_file_location加载一个模块并选择一个函数时,一切正常

  • 当我用spec_from_file_location加载一个模块并查找一个类时, 它失败于:

    TypeError: <class 'mymod.ArgMaster'> is a built-in class
    

    (不是,是我写的。)

以下是我的全部资料来源:

import os, inspect, importlib

filename = 'arg_master.py'
spec = importlib.util.spec_from_file_location("mymod", filename)
mymod = importlib.util.module_from_spec(spec)
spec.loader.exec_module(mymod)
func = vars(mymod)['ArgMaster']
inspect.getsource(func)            #<<< Fails

加载method number 2也会失败:

import importlib, types

filename = 'arg_master.py'
loader = importlib.machinery.SourceFileLoader('mod', filename)
mod = types.ModuleType(loader.name)
loader.exec_module(mod)
func = vars(mod)['ArgMaster']
inspect.getsource(func)

编辑:我找到了一个黑客解决方案:

import inspect

filename = 'arg_master.py'
name = os.path.basename(filename)
name = os.path.splitext(name)[0]
importlib.import_module(name)
func = vars(mod)['ArgMaster']
inspect.getsource(func)

Tags: namefromimportmastermodargimportlibfilename
1条回答
网友
1楼 · 发布于 2024-10-03 15:30:06

我在您的代码中也遇到了同样的错误,奇怪的是,它只适用于函数,而不适用于类。以下内容基本上与您的解决方案相同,只是稍微少了一点“黑客”,因为您不必弄乱文件路径:

import inspect, importlib
cls = getattr(importlib.import_module('arg_master'), 'ArgMaster')
print(inspect.getsource(cls))

如果两个模块位于同一目录中,则此操作将起作用。如果需要进行相对导入,可能需要处理package=__pckage__或类似的问题

相关问题 更多 >