news 2026/9/13 16:21:08

易语言调用Python3全攻略:管道、HTTP与嵌入式方案详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
易语言调用Python3全攻略:管道、HTTP与嵌入式方案详解

简介:面向易语言开发者,这份压缩包提供了一套易语言与Python3无缝调用的完整方案,适合需要在现有易语言项目中嵌入爬虫、数据处理或AI功能的场景。包内包含易语言扩展模块与示例工程,配合Python服务端脚本和依赖库,实现了从易语言发起调用、传递参数到接收返回结果的闭环,省去自行设计通信协议的麻烦。资源共12个文件,以e源码、ec模块、py脚本及说明文档为主,压缩包大小约51MB,并附有运行截图和版本管理配置。目前已有62人学习下载。借助精易模块等辅助组件,开发者可以更快搭建跨语言桥接,同时通过README和示例代码理解调用流程,适合有基础易语言知识、希望扩展Python能力的用户参考。

1. 易语言调 Python3,先想清楚“无缝”到底指什么

做易语言开发的人,迟早会遇到一个坎:界面、控件、内存操作、大漠插件这类活,易语言是真顺手;但一旦碰到 JSON 解析、正则批量处理、图像识别、机器学习,或者想把某个 Python 写的算法库直接用上,易语言自带的库就捉襟见肘了。很多人的第一反应是“我这有 Python 的 exe,直接运行它不就行了”,但真正做过一两次就知道,传参、取返回值、处理中文、等待进程结束,每一步都有坑。这个标题里“无缝调用”四个字,说的不是把 Python 打包成 exe 再甩给易语言,而是让易语言在运行时直接拉起 Python3 解释器、传数据进去、拿结果回来,整个过程像调用一个 DLL 一样顺。这篇文就把易语言和 Python3 通信的几种常见做法讲透,从最简单的管道通信到嵌入式 C API,覆盖不同需求场景,最后落在一套易语言模块封装技巧上。

2. 先选通信方案:管道、HTTP 还是嵌入式,判断标准只有一个

易语言和 Python3 通信,本质上是两个独立进程之间的数据交换。所谓“无缝”,是指易语言进程内不需要关心 Python 解释器怎么启动、脚本在哪、依赖库怎么装,只关心我传进去什么、拿回来什么。基于这个定位,方案选型就清晰了:进程越独立,稳定性越高,但实时性和交互性越差;进程越融合,效率越高,但崩溃风险也越大。常见做法有三种:命令行加标准输入输出管道、本地 HTTP JSON 服务、嵌入式 Python C API。我的建议是,先按使用场景选,而不是按技术难度选。

场景 1:低频调用,每天几十次,对延迟不敏感,传参简单。比如易语言定时把一批数据丢给 Python 处理,完事取回结果。这种用管道方案最合适,零依赖、Python 侧就是普通脚本,易语言侧一条命令行就能干完。

场景 2:高频调用,一个业务周期内反复请求,或者易语言和 Python 需要维持会话状态。比如 Python 侧加载了一个大模型或者训练好的分类器,不能每次请求都重新加载。这种必须用常驻进程方案,最常见的就是本地 HTTP JSON 服务,Python 侧起 Flask 或 http.server,易语言侧用客户组件发 POST 请求。

场景 3:易语言程序要发布给终端用户,用户机器上不能保证装了 Python3。这时候就得走嵌入式路线,把 Python 解释器以 DLL 形式静态链接进易语言程序,或者用 PyInstaller 把 Python 环境连同依赖一起打包成独立目录,易语言通过调用 DLL 的方式操作 Python 解释器。这条路坑最多,放到第 4 章单独讲。

选型列表看起来很长,但判断标准就一条:你能不能接受 Python 侧是独立进程。能接受,优先管道和 HTTP;不能接受,再上嵌入式。别一上来就搞 C API,易语言里操作 PyObject 指针,调试成本成倍增加。

3. 易语言与 Python3 管道通信:最小可运行示例

管道通信是入门最快、踩坑最少的方案。原理很简单:易语言启动 Python3 解释器执行一个 .py 脚本,Python 脚本从 stdin 读取参数,把处理结果写到 stdout,易语言等进程结束后读取输出。这里有个细节必须先说清楚:易语言默认的文本编码是 ANSI(GBK),Python3 默认字符串是 Unicode,在管道传输时编码不一致会导致中文乱码,这个在第 5 章专门讲,这一章先跑通英文字符串。

3.1 易语言侧:“运行”命令加重定向

易语言自带“运行”命令,但它只负责启动程序,不负责捕获输出。要拿回 Python 的输出,需要把 Python 的标准输出重定向到一个临时文件,然后易语言读取这个文件。这看起来不够优雅,但它是没有第三方模块时最稳的做法。核心代码逻辑如下:

.版本 2 .支持库 spec .子程序 调用Python脚本, 文本型, 公开 .参数 脚本路径, 文本型 .参数 输入数据, 文本型, 可空 .局部变量 命令行, 文本型 .局部变量 输出文件, 文本型 .局部变量 临时目录, 文本型 .局部变量 结果文本, 文本型 临时目录 = 取运行目录 () + “\temp” 输出文件 = 临时目录 + “\py_out.txt” ' 把输入数据写入临时文件,避免命令行传参长度和特殊字符问题 写到文件 (临时目录 + “\py_in.txt”, 到字节集 (输入数据)) 命令行 = “python3 ” + 脚本路径 + “ < ” + 临时目录 + “\py_in.txt” + “ > ” + 输出文件 运行 (命令行, 假, 1) ' 等待进程结束 判断循环首 (文件是否存在 (输出文件) = 假) 处理事件 () 判断循环尾 结果文本 = 到文本 (读入文件 (输出文件)) 返回 (结果文本)

这段代码里有三个关键参数。第一,运行 (命令行, 假, 1)的第三个参数是“等待运行完毕”标志,设为 1 表示让易语言程序暂停往下执行,直到命令行里的进程退出。第二,重定向符号<>是操作系统 shell 功能,不是 Python 的功能,所以命令行必须以字符串形式传给“运行”命令,不能拆开。第三,判断循环里的处理事件 ()是易语言特有的,作用是让窗口消息循环不卡死,否则界面会假死。这个方案的好处是输入输出都是文件,内容再多也不会撑爆命令行长度限制。

3.2 Python 侧:从 stdin 读、向 stdout 写

Python 侧脚本要写得健壮,核心用sys.stdin.read()一次性读取全部输入,而不是用input()逐行读。因为易语言写文件时是一次性写完,但input()遇到多行文本会只取第一行。处理完的数据用print()输出到 stdout,重定向后自然进入输出文件。一个标准模板脚本:

import sys import json def handle(data): # 这里写你的业务逻辑 try: obj = json.loads(data) return {"status": "ok", "result": obj.get("value", 0) * 2} except Exception as e: return {"status": "error", "message": str(e)} if __name__ == "__main__": raw = sys.stdin.read() result = handle(raw) print(json.dumps(result, ensure_ascii=False))

这里的逻辑说明:stdin.read()会读到 EOF 才返回,而文件重定向天然提供了 EOF,所以易语言写完文件后重定向启动 Python,Python 能准确拿到完整内容。print()默认在输出末尾加换行,这没问题,易语言读文件时会完整读入。有两个参数需要根据场景调整:json.dumps里的ensure_ascii=False是为了让中文以原始字符输出而不是 \uXXXX 转义序列;如果没有 JSON 依赖,直接用print(raw.upper())之类处理也行,模板里的 JSON 只是为了演示结构化数据交互。

3.3 管道方案的三个必调参数

管道方案跑通容易,但要稳定运行,有三个参数必须调。第一个是python3命令路径。很多 Windows 机器只有python没有python3,或者装的是微软商店版,命令行里能走通但易语言里拉不起来。常见做法是易语言里加一个“Python路径”配置项,默认尝试python3,失败自动切换python,再不行就让用户手动填解释器绝对路径。

第二个是临时文件的写入等待。写完输入文件后立刻重定向运行,理论上没问题,但杀毒软件或磁盘缓存可能导致 Python 读到的文件不完整。稳妥起见,写完文件后加一句文件是否存在的确认,或者直接删除旧输出文件之后再运行,避免读到上一次的结果。

第三个是进程执行时间。Python 脚本如果跑得久,易语言的“等待运行”会把界面卡住。处理办法要么在等待循环里加超时计数,要么把易语言这边的逻辑改成异步:启动 Python 后不等待,用一个定时器周期性检查输出文件是否生成,生成后再读取。这两种方式分别适合同步交互和后台任务,我一般做内部工具用同步,做面向用户的界面用异步定时器。

配置项示例: [Python] 解释器路径 = C:\Python311\python.exe 超时时间(秒) = 30 临时目录 = .\temp

这个配置文件的解析很简单,易语言读 INI 用“读配置项”命令。重点解释“解释器路径”参数:不要留空让系统去 PATH 里找,因为易语言程序发布后运行环境不可控,用户机器的 PATH 可能被各种软件改得乱七八糟。指定绝对路径,配合一个“自动探测”按钮,启动时检测一次路径是否有效,能省掉后续大量排障时间。

4. 用 HTTP JSON 让易语言和 Python3 保持长连接通信

管道方案每次调用都要启动一次 Python 解释器,启动耗时大约 200~500 毫秒,如果 Python 侧还要加载第三方库,比如numpypandasastropy,那启动时间可能超过 2 秒。更麻烦的是,有些库初始化一次之后才能用,重复初始化纯属浪费。这时候就该上常驻进程方案了。我一般推荐用 HTTP JSON,因为 HTTP 是事实标准,易语言客户组件直接支持 POST 和 GET,Python 侧用标准库http.server就能写,完全不需要装 Flask,契合“离线安装第三方库”的痛点。

4.1 易语言客户组件发 POST 请求:最低依赖实现

易语言的“客户”支持库可能在部分精简版环境里没有,所以先检查支持库配置。如果支持库齐全,用“客户1.连接”加“客户1.发送数据”就能完成请求。但如果只发送数据不接收响应,那实际是单向通信,不满足“通信”要求。正确做法是配合“数据到达”事件来异步收响应,或者更简单一点:直接用 WinHTTP 组件通过命令调用发送 HTTP 请求并同步等待响应。后者在逻辑上更接近其他语言里的requests.post体验。

.版本 2 .支持库 spec .支持库 eHttp .子程序 _发送JSON请求, 文本型 .参数 请求地址, 文本型 .参数 JSON数据, 文本型 .局部变量 WinHttp对象, 对象 .局部变量 响应文本, 文本型 WinHttp对象.创建 (“WinHttp.WinHttpRequest.5.1”, ) WinHttp对象.方法 (“Open”, “POST”, 请求地址, 假) WinHttp对象.方法 (“SetRequestHeader”, “Content-Type”, “application/json; charset=utf-8”) WinHttp对象.方法 (“Send”, JSON数据) ' 等待响应 WinHttp对象.方法 (“WaitForResponse”, 10) 响应文本 = WinHttp对象.读文本属性 (“ResponseText”, ) 返回 (响应文本)

这个代码里,Open的第四个参数设为假表示同步请求,执行到Send后会阻塞直到响应返回或超时。WaitForResponse的参数 10 表示最长等待 10 秒。ResponseText拿到的就是 Python 服务端返回的 JSON 字符串。这里有一个对易语言开发者来说特别容易忽略的点:JSON 数据里不能有易语言文本型的 Unicode 字节,必须先把文本转换成 UTF-8 编码再发送。易语言里用“编码转换”支持库里的“Ansi到Utf8”或“编码_URL编码”处理,否则中文到达 Python 侧会变成乱码。

4.2 Python 侧常驻服务:标准库 http.server 实现

Python 侧的服务端,有很多人上来就装 Flask,但对于这种内部通信场景,标准库足够,还省去装依赖和打包体积。重写BaseHTTPRequestHandler的核心逻辑,用do_POST处理 JSON 请求,响应写回 JSON:

from http.server import HTTPServer, BaseHTTPRequestHandler import json import urllib.parse class Handler(BaseHTTPRequestHandler): def do_POST(self): # 读取请求体 length = int(self.headers.get('Content-Length', 0)) body = self.rfile.read(length).decode('utf-8') try: req = json.loads(body) result = self.process(req) resp = {"code": 0, "data": result} except Exception as e: resp = {"code": 1, "message": str(e)} # 返回 JSON 响应 data = json.dumps(resp, ensure_ascii=False).encode('utf-8') self.send_response(200) self.send_header('Content-Type', 'application/json; charset=utf-8') self.send_header('Content-Length', str(len(data))) self.end_headers() self.wfile.write(data) def process(self, req): # 业务逻辑:按请求里的 action 分发 action = req.get("action", "") if action == "calculate": return req.get("a", 0) + req.get("b", 0) elif action == "analyze": # 这里可以加载一次模型,保存在全局 return run_analysis(req.get("text", "")) return {"error": "unknown action"} def log_message(self, fmt, *args): # 静默访问日志,避免控制台刷屏,可改为写日志文件 pass model = None def run_analysis(text): global model if model is None: # 模拟加载大模型 model = {"loaded": True} return {"model_loaded": model["loaded"], "text_length": len(text)} if __name__ == "__main__": server = HTTPServer(("127.0.0.1", 8765), Handler) print("server running on 8765") server.serve_forever()

这个例子里的process方法做了一件事:按请求里的action字段分发给不同函数。这是常用套路,因为单进程单端口服务多个功能,比每个功能开一个端口好管理。run_analysis里演示了全局变量model的懒加载,第一次调用时加载模型,后续调用直接复用,这就解决了管道方案里反复加载耗时长的问题。

4.3 必调参数与踩坑:请求体大小、端口占用、线程安全

三个参数值得单独说。第一个是Content-Length头,易语言发送 POST 请求时,一些封装库会自动带上这个头,但如果是手动拼报文,忘了加Content-Length,Python 侧self.rfile.read(length)读到的长度为 0,请求体为空,返回的永远是错误。这是 HTTP JSON 通信里最常见的低级错误。

第二个是端口占用。HTTPServer默认是单线程,一次只处理一个请求,如果易语言并发发多个请求,后面的会排队。更麻烦的是服务崩溃后端口不会立刻释放,重启时报 “Address already in use”。解决办法是对端口做预检测,Python 侧启动时先尝试绑定,失败就打印提示并等待几秒重试。

第三个是ThreadingHTTPServer的选型。Python 3.7 之后有现成的ThreadingHTTPServer,继承自socketserver.ThreadingMixIn,每个请求一个线程。但注意:如果业务逻辑里有共享全局变量,比如上面的model,多线程并发访问需要加锁。易语言侧如果是单客户组件,一般不会触发并发,但保险起见服务端加一个threading.Lock包裹模型推理部分。

5. 嵌入式调用:把 Python3 解释器装进易语言程序里

管道和 HTTP 都要求目标机器上存在可用的 Python3 解释器。如果易语言写的是一个要发给客户用的工具,客户机器上没有 Python 环境,或者系统 Python 版本、路径不可控,这两个方案都悬。嵌入式方案的意思是把 Python3 的解释器核心(python3.dll)连同标准库、第三方依赖库一起放在易语言程序目录下,易语言直接通过 DLL 命令调用 Python 的 C API,整个程序对外看起来就是一个普通的 exe,用户不需要感知 Python 的存在。

5.1 环境部署:嵌入式 Python 包与依赖库位置

嵌入式部署的常规做法是:从 Python 官网下载 Windows embeddable package,解压后得到 python311.dll、python311.zip(内含标准库)、一组 DLL 文件。然后需要修改python311._pth文件,把标准库和第三方库的路径写正确。易语言程序目录结构通常如下:

程序目录/ ├── 主程序.exe ├── python311.dll ├── python311.zip ├── python311._pth ├── Lib/site-packages/ # 第三方库安装位置 └── 业务脚本.py

_pth文件的内容决定了解释器的模块搜索路径。一个可用的配置是:

python311.zip Lib/site-packages . import site

最后一行import site很关键,没有它site-packages里的第三方库不会自动加入sys.path,离线安装的numpy等库会全部 import 失败。易语言侧调用 DLL 命令前,先设置环境变量PYTHONHOME指向程序目录,再Py_Initialize初始化解释器,就能保证解释器只在程序目录找模块,不受系统其他 Python 影响。

5.2 易语言声明 Python C API:从初始化到执行单行代码

易语言里调用 DLL 命令用的是“DLL命令”定义,声明函数名、参数类型、返回值类型。Python C API 的函数参数和返回值大量使用PyObject*指针,在易语言里统一声明为“整数型”。初始化流程分三步:设置路径、初始化解释器、执行脚本。DLL 声明示例如下:

.版本 2 .DLL命令 Py_Initialize, , "python311.dll", "Py_Initialize" .参数 无 .DLL命令 Py_Finalize, , "python311.dll", "Py_Finalize" .参数 无 .DLL命令 PyRun_SimpleString, 整数型, "python311.dll", "PyRun_SimpleString" .参数 代码, 文本型 .DLL命令 PyRun_SimpleFile, 整数型, "python311.dll", "PyRun_SimpleFileExFlags" .参数 文件指针, 整数型 .参数 文件名, 文本型 .参数 全局变量, 整数型 .参数 标志, 整数型

调用顺序不能乱:先Py_InitializePyRun_SimpleString,程序退出前一定调用Py_Finalize。如果一个易语言程序里初始化了两次解释器,第二次会直接崩溃,这是 C API 的硬性限制。

实际执行脚本时,不推荐用PyRun_SimpleFile直接跑 .py 文件,因为文件路径和编码问题会把问题复杂化。更可控的方式是先把 Python 代码读成文本,再用PyRun_SimpleString执行。但要注意:PyRun_SimpleString执行的是单条语句或单个代码块,如果脚本里有中文注释且易语言读出文本是 ANSI 编码,Python 解释器会报编码错误。所以在把脚本喂给解释器之前,必须把文本转为 UTF-8 字节,再用 C API 的PyRun_String配合Py_file_input标志执行。

5.3 一个完整的嵌入式调用流程

结合上面声明,易语言子程序的执行流程如下:

.子程序 _嵌入式执行Python, 文本型, 公开 .参数 脚本内容, 文本型 .局部变量 utf8脚本, 字节集 ' 转成 UTF-8 utf8脚本 = 编码转换 (到字节集 (脚本内容), #编码_GBK, #编码_UTF_8, ) ' 写到临时文件,再读成 char*,或直接用指针方式传入 写到文件 (取运行目录 () + “\tmp_script.py”, utf8脚本) ' 假设已经初始化过解释器,直接在易语言里调用 PyRun_SimpleFile ' 这里需要用 文件流方式 打开文件,实际易语言里可配合 打开文件 获取文件号 Py_Run_SimpleFile (文件号, “tmp_script.py”, 0, 0) ' 读取结果文件 返回 (到文本 (读入文件 (取运行目录 () + “\tmp_result.txt”)))

这个流程里的参数说明:PyRun_SimpleFile的第一个参数是FILE*指针,易语言中没有原生指针类型,需要通过外部库把易语言的文件号转成 C 文件指针,或者用_wfopen打开文件拿到指针。这一步是嵌入式方案里最容易卡住的地方。我的建议是可以跳过PyRun_SimpleFile,直接在 Python 脚本内部用open()读取输入文件和写结果文件,易语言只负责把文件准备好,调用PyRun_SimpleString执行一个短字符串,比如exec(open(r'C:\path\script.py').read())。这样只需要传一个合法的路径字符串给解释器,完全绕开文件指针转换。

PyRun_SimpleString执行时的编码问题同样需要注意:字符串必须是 UTF-8,因为易语言文本型在 DLL 调用边界会按 ANSI 转换为char*,不是 UTF-8。解决方法是先转换成字节集,取字节集指针作为参数传入。这一步不处理好,脚本里任何中文字符串都会导致执行失败或乱码。具体的编码转换技巧在第 6 章统一说明。

6. 中文编码与调试技巧,封装成易语言模块才是终点

易语言和 Python3 通信的所有方案里,中文乱码是出现频率最高的疑难杂症。根因只有一个:易语言的“文本型”在内存中是 ANSI 编码的字节序列,而 Python3 的str是 Unicode,系统默认按 UTF-8 编码读写外部数据。两者转换稍微错位,轻则显示乱码,重则抛出UnicodeDecodeError,整个脚本中断。

6.1 三种场景的编码处理规格

按通信方式分类,处理方式不同。管道方案里,输入文件和输出文件都是字节流,易语言侧写到文件用“到字节集”得到 ANSI 字节,Python 侧读取时用open('file', encoding='gbk')显式指定编码;反过来 Python 写结果文件时用open('file', 'w', encoding='gbk'),易语言读入后直接到文本,不需要额外转换,这样两边都用 GBK,全程一致。HTTP JSON 方案里,POST 请求体必须 UTF-8,Python 侧decode('utf-8'),响应也指定charset=utf-8,易语言收响应后要把字节集从 UTF-8 转到 ANSI 再转文本。嵌入式方案里,传进PyRun_SimpleString的字符串或者脚本文件落地编码,统一用 UTF-8。

# Python 侧读写文件的通用模板 import sys def read_input(): # 尝试 UTF-8,失败回退 GBK,兼容两种调用方 raw = sys.stdin.buffer.read() for enc in ('utf-8', 'gbk'): try: return raw.decode(enc) except UnicodeDecodeError: continue return raw.decode('utf-8', errors='ignore')

这个模板里的sys.stdin.buffer.read()拿到的是原始字节不经过解码,然后用循环尝试不同编码。这样不管易语言侧传过来的是 UTF-8 还是 GBK,Python 都不至于直接崩。对应的输出侧,也优先输出 UTF-8,并通过 HTTP 头或管道文件名的约定让易语言那边知道用哪个编码读取。

6.2 找错方法:让 Python 把异常写到文件而不是控制台

管道方案里,Python 脚本一抛异常,traceback 会写到 stderr,但易语言重定向时经常只重定向了 stdout,没管 stderr。结果就是 Python 崩了,易语言读回来的输出文件是空的,排查无从下手。我的习惯是在所有 Python 脚本开头加一个全局异常捕获,把异常堆栈写入一个独立的错误日志文件:

import sys import traceback def main(): # 业务逻辑入口 pass if __name__ == "__main__": try: main() except Exception: with open("error.log", "w", encoding="utf-8") as f: traceback.print_exc(file=f) sys.exit(1)

这个写法的参数说明:traceback.print_exc(file=f)把完整堆栈打印到文件对象,比直接打印到 stderr 可控。易语言侧在“等待运行”结束后,先检查error.log是否存在,存在就把内容读回来显示给用户,这样哪怕 Python 脚本因语法错误无法启动,也能在易语言界面上看到具体错误行号。另一个常用的调试技巧是:在易语言调用命令行的最前面加cmd /c,这样重定向符号由 cmd 处理,兼容性更好;但加了cmd /c之后,错误信息会混在输出里,所以分开操作更稳妥,干脆让 Python 自己管理日志文件。

6.3 进阶封装:把整套通信模式做成易语言模块

到这里,底层方案已经齐了,最后一步是把这些逻辑封装成一个易语言模块,对外只暴露一个易用的子程序。我经常在模块里设计两个公开接口,一个同步调用,一个异步调用。同步调用的签名是“调用Python (脚本文件名作为标识, 输入数据, 超时秒数) → 返回文本”,内部根据配置自动选择管道、HTTP 或嵌入式通道;异步调用则是把同样的参数交给一个线程,完成后通过回调事件通知界面更新。这样业务代码里完全不出现任何通信细节,后续想换通信方式,只需要改模块内部的“选择通道”逻辑,业务子程序一行不用动。

封装时有一个必须考虑的细节:不同通信通道对输入参数的类型要求不同,管道要求的是文本,HTTP 要求的是 JSON 序列化后的文本,嵌入式要求在内存中构造 Python 对象。为了统一,模块内部强制约定:所有进出的数据都用 JSON 字符串表达。管道方案里,易语言先把 JSON 字符串写入输入文件;HTTP 方案里直接作为 POST body;嵌入式方案里先构造 Python 字典再转 JSON。这样易语言侧只需要处理 JSON 的序列化和反序列化,易语言自带“json”支持库只支持部分语法,如果觉得限制太多,可以用第三方 json 模块。这种统一封装的收益是长远的,等到 Python 侧升级接口、或者从管道切到 HTTP 时,易语言主程序完全不受影响。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 16:19:17

SpringBoot+Vue构建农产品直卖平台技术解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 16:18:12

Starr收购IQUW:保险科技全球化战略解析

1. 收购事件概述2023年11月10日&#xff0c;全球领先的保险科技公司Starr正式宣布完成对英国专业保险集团IQUW Group的战略收购。这笔交易金额未公开的收购案&#xff0c;标志着Starr在国际保险市场扩张战略中迈出关键一步。作为交易的一部分&#xff0c;IQUW Group将保持独立运…

作者头像 李华
网站建设 2026/9/13 16:17:38

DNA存储技术:Python实现数据到生物分子的编码转换

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 16:17:32

MATLAB QAM调制解调GUI设计:从原理到硬件验证

简介&#xff1a;本资源是一套基于MATLAB实现的QAM调制与解调全过程仿真实验GUI系统&#xff0c;面向通信工程、电子信息类专业本科生及入门级仿真学习者&#xff0c;有效解决数字调制原理理解难、代码实现门槛高、可视化交互缺失等实践痛点。压缩包共11个文件&#xff0c;含7个…

作者头像 李华
网站建设 2026/9/13 16:17:16

如何用 AI SDK 的 generateSpeech 生成语音并获取音频数据

如何用 AI SDK 的 generateSpeech 生成语音并获取音频数据 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and agents 项目地址: https://gitcode.com…

作者头像 李华