-
当我直接从模块加载类的源代码时,这很好:
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__
或类似的