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


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

    import arg_master

    inspect.getsource(func)

  • 当我用spec_from_file_location加载一个模块并执行一个函数时,这很好。

  • 当我用CCD_ 4加载一个模块并去一个类时,它失败了:

    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

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)

我在您的代码中遇到了同样的错误,奇怪的是,这对函数有效,但对类无效。下面这与您的解决方案基本相同,只是稍微少了一点";"黑客";因为你不必弄乱文件路径:

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

如果两个模块在同一目录中,这将起作用。如果你需要进行相对导入,可能需要使用package=__pckage__或类似的

相关内容

最新更新