Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用inspect.getsource()加载源代码时失败,表示它可以';I don’我不读内置的课程。(它不是)_Python_Inspect_Python Importlib - Fatal编程技术网

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的模块并选择函数时,一切正常

  • 当我从\u file\u location加载一个带有
    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))