gpt4 book ai didi

python - 如何在保留调试的同时从字符串加载 Python 模块?

转载 作者:行者123 更新时间:2023-12-01 21:33:38 25 4
gpt4 key购买 nike

我对加载源代码嵌入到 C 扩展中的 Python 模块很感兴趣。应该可以使用 Python 的 importlib 机制(如 importlib.util.spec_from_file_location)做一些事情,以便在调试时显示源代码。我将如何实现 importlib.util.spec_from_string

最佳答案

下面是如何定义一个从字符串中获取模块源的加载器,然后创建模块并将其加载到 sys.modules 中。如果模块的源不在文件中,它可能很有用。如果已有文件,则使用 https://docs.python.org/3/library/importlib.html#importing-a-source-file-directly

尽管 inspect.getsource(module) 适用于 importlib.abc.InspectLoader 的子类,但只需要定义 get_source,tracebacks 和 pdb 似乎不愿意显示源代码,直到您从 SourceLoader 继承。

import sys
import importlib.abc, importlib.util

class StringLoader(importlib.abc.SourceLoader):
def __init__(self, data):
self.data = data

def get_source(self, fullname):
return self.data

def get_source(self, fullname):
return self.data

def get_data(self, path):
return self.data.encode("utf-8")

def get_filename(self, fullname):
return "<not a real path>/" + fullname + ".py"

module_name = "testmodule"
with open("testmodule.py", "r") as module:
loader = StringLoader(module.read())

spec = importlib.util.spec_from_loader(module_name, loader, origin="built-in")
module = importlib.util.module_from_spec(spec)
sys.modules[module_name] = module
spec.loader.exec_module(module)

关于python - 如何在保留调试的同时从字符串加载 Python 模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62294877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com