Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.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模块?_Python_Python Importlib - Fatal编程技术网

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

如何在保留调试的同时从字符串加载Python模块?,python,python-importlib,Python,Python Importlib,我感兴趣的是加载一个源代码嵌入到C扩展中的Python模块。应该可以使用Python的importlib机制,如importlib.util.spec\u from\u file\u location,以便在调试时显示源代码。如何从字符串中实现importlib.util.spec\u?作为一个快速解决方案,您可以将其转储到临时模块中,使用exec导入,并在完成后删除临时模块 下面是一个玩具示例: dummy_src =""" print("imported!") x = 5 """

我感兴趣的是加载一个源代码嵌入到C扩展中的Python模块。应该可以使用Python的
importlib
机制,如
importlib.util.spec\u from\u file\u location
,以便在调试时显示源代码。如何从字符串中实现
importlib.util.spec\u?

作为一个快速解决方案,您可以将其转储到临时模块中,使用
exec
导入,并在完成后删除临时模块

下面是一个玩具示例:

dummy_src =""" 
print("imported!") 
x = 5 
""" 

with open("temp.py", "w") as f: 
    f.write(dummy_src) 

exec("import temp") 
print(temp.x)
输出:

imported!
5

作为一种快速修复方法,您可以将其转储到临时模块中,使用
exec
导入它,并在完成后删除临时模块

下面是一个玩具示例:

dummy_src =""" 
print("imported!") 
x = 5 
""" 

with open("temp.py", "w") as f: 
    f.write(dummy_src) 

exec("import temp") 
print(temp.x)
输出:

imported!
5

下面是如何定义一个从字符串获取模块源代码的加载程序,然后创建模块并将其加载到
sys.modules
。如果模块的源代码不在文件中,那么它可能很有用。如果已经有文件,则使用

虽然
inspect.getsource(module)
适用于
importlib.abc.InspectLoader
的子类,只需为其定义
get\u source
,但在继承
SourceLoader
之前,回溯和
pdb
似乎不愿意显示源代码

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)
导入系统 导入importlib.abc、importlib.util 类StringLoader(importlib.abc.SourceLoader): 定义初始化(自身,数据): self.data=数据 def get_源(自身,全名): 返回self.data def get_源(自身,全名): 返回self.data def get_数据(自身、路径): 返回自我数据编码(“utf-8”) def get_文件名(self,fullname): 返回“/”+fullname+“.py” module_name=“testmodule” 以open(“testmodule.py”、“r”)作为模块: loader=StringLoader(module.read()) spec=importlib.util.spec\u from\u loader(模块名称,loader,origin=“内置”) module=importlib.util.module\u from_spec(spec) 系统模块[模块名称]=模块 规格加载器执行模块(模块)
以下是如何定义从字符串获取模块源代码的加载程序,然后创建模块并将其加载到
sys.modules
。如果模块的源代码不在文件中,那么它可能很有用。如果已经有文件,则使用

虽然
inspect.getsource(module)
适用于
importlib.abc.InspectLoader
的子类,只需为其定义
get\u source
,但在继承
SourceLoader
之前,回溯和
pdb
似乎不愿意显示源代码

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)
导入系统 导入importlib.abc、importlib.util 类StringLoader(importlib.abc.SourceLoader): 定义初始化(自身,数据): self.data=数据 def get_源(自身,全名): 返回self.data def get_源(自身,全名): 返回self.data def get_数据(自身、路径): 返回自我数据编码(“utf-8”) def get_文件名(self,fullname): 返回“/”+fullname+“.py” module_name=“testmodule” 以open(“testmodule.py”、“r”)作为模块: loader=StringLoader(module.read()) spec=importlib.util.spec\u from\u loader(模块名称,loader,origin=“内置”) module=importlib.util.module\u from_spec(spec) 系统模块[模块名称]=模块 规格加载器执行模块(模块)
您想在Python的C扩展中嵌入Python代码吗?你能举个例子说明这是如何有用的吗?我怀疑这更像是一个XY问题。因为它是一个将Python嵌入到另一个程序中的插件。那个“其他程序”也是Python程序还是C程序?(或者您希望使用二进制格式的C扩展/插件?)我这样问是因为您需要Python本身来执行Python代码,当然,如果您的其他程序不是Python,这不是一个小问题。如果您的另一个程序是Python,我认为有更好的方法来解决这个问题,而不是将脚本嵌入到C扩展中?你能举个例子说明这是如何有用的吗?我怀疑这更像是一个XY问题。因为它是一个将Python嵌入到另一个程序中的插件。那个“其他程序”也是Python程序还是C程序?(或者您希望使用二进制格式的C扩展/插件?)我这样问是因为您需要Python本身来执行Python代码,当然,如果您的其他程序不是Python,这不是一个小问题。如果您的另一个程序是Python,我认为有更好的方法来解决这个问题,而不是将脚本嵌入到C扩展中