Python 使用inspect.getsource()加载源代码时失败,表示它可以';I don’我不读内置的课程。(它不是)
当我直接从模块加载一个类的源代码时,这很好:Python 使用inspect.getsource()加载源代码时失败,表示它可以';I don’我不读内置的课程。(它不是),python,inspect,python-importlib,Python,Inspect,Python Importlib,当我直接从模块加载一个类的源代码时,这很好: import arg\u master inspect.getsource(func) 当我从文件位置加载带有spec\u的模块并选择函数时,一切正常 当我从\u file\u location加载一个带有spec\u的模块并开始一个类时, 它失败于: TypeError: <class 'mymod.ArgMaster'> is a built-in class 编辑:我找到了一个黑客解决方案: import inspect
import arg\u master
inspect.getsource(func)
spec\u的模块并选择函数时,一切正常
spec\u的模块并开始一个类时,
它失败于:
TypeError: <class 'mymod.ArgMaster'> is a built-in class
编辑:我找到了一个黑客解决方案:
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=\uuuuupckage\uuuuu>或类似的调试时间。跟踪inspect
的内部——为什么它认为它是一个内置类。我的猜测是,以这种方式生成的模块对象不知何故不被视为基于源代码的模块。问题似乎从这里开始:
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))