You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Python工具模块以源代码字符串形式导入至动态库?

从字符串字面量导入Python模块的实现方案

当然可以!Python原生就支持从字符串字面量导入模块,完全适配你把代码嵌入动态库的需求——不管是Windows下的字符串资源,还是Linux下导出的字符串返回函数,都能完美衔接。下面提供两种实用的实现方式:

方法一:快速实现(用exec()+空模块对象)

这种方式简单直接,适合快速嵌入单个模块:

# 模拟从动态库获取的源代码字符串(实际场景中替换为从资源/导出函数读取的内容)
embedded_module_source = """
def func():
    return 1

class ToolClass:
    def process(self, input_val):
        return f"Processed: {input_val * 2}"
"""

# 创建一个空的模块对象,指定模块名
import types
mymod = types.ModuleType("mymod")

# 将源代码执行到模块的命名空间中
exec(embedded_module_source, mymod.__dict__)

# 现在可以像使用普通模块一样调用
print(mymod.func())  # 输出:1
print(mymod.ToolClass().process(5))  # 输出:Processed: 10

方法二:规范导入(适配Python模块系统)

如果需要让嵌入的模块能被import语句正常引用,或者要纳入Python的模块管理体系,推荐用importlib工具链:

import importlib.util
import sys

# 从动态库获取的源代码字符串
embedded_module_source = """
def func():
    return 1
"""

# 生成模块规范,标记来源方便调试
spec = importlib.util.spec_from_loader(
    "mymod",
    loader=None,
    origin="embedded_dynamic_library"  # 自定义来源标识
)

# 创建模块对象并执行源代码
mymod = importlib.util.module_from_spec(spec)
exec(embedded_module_source, mymod.__dict__)

# 将模块注册到sys.modules,这样后续可以直接import
sys.modules["mymod"] = mymod

# 之后就能像普通模块一样导入使用
import mymod
print(mymod.func())  # 输出:1

关键注意事项

  • 缩进与格式:Python对缩进、换行符敏感,从动态库读取源代码时必须完整保留原始格式,不能丢失缩进或换行,否则会触发语法错误。
  • 依赖处理:如果嵌入的模块依赖其他第三方库,要确保运行环境中已安装这些依赖。
  • 动态库适配:
    • Windows:将Python源代码作为字符串资源嵌入DLL,用Win32 API(如LoadString)读取成Python字符串后再导入。
    • Linux:导出一个C函数(如const char* get_python_module_source()),返回源代码字符串的指针,在Python中通过ctypes调用该函数获取字符串。

内容的提问来源于stack exchange,提问作者Roel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:05:32