Linux里JSA执行脚本并获取其输出的第三种方法
Lv.2潜力创作者
Linux版WPS里JSA的Shell方法还是不能带参数。。。
一、system方法
曾经分享过,通过glibc里的system方法执行脚本,输出到临时文件,再读取
| 📌 | ExecuteExcel4Macro(`CALL("libc.so.6", "system", "JC", "zenity --calendar")`) |
二、fork方法
曾经分享过,通过glibc里的fork、pipe、dup2、execlp等方法,将脚本的输出转向管道,再从主进程读取
https://bbs.wps.cn/topic/74814
三、popen方法
昨天提到,wps里可以调用duckdb
https://bbs.wps.cn/topic/84597
但通过ffi调用的方式有点麻烦
今天正好试一下通过popen方法调用它,并获取其输出
300万行的表1秒出结果真香
| 📌 | function cc() { const {popen,fileno,pclose} = ffi.LoadLibrary("glibc.so", { popen: { returnType: "pointer", parameters: ["string", "string"]}, fileno: { returnType: "int32", parameters: ["pointer"]}, pclose: { returnType: "int32", parameters: ["pointer"]}, }) const f = popen(`duckdb -csv -c "select x, sum(y) from 'a.csv' group by x;"`, "r") const n = fileno(f) const r = FileSystem.ReadFile(`/dev/fd/${n}`) pclose(f) console.log(r.trim()) } |
其中a.csv是300万行的例表
duckdb -csv设置输出格式为csv
调用的过程只有四行:
popen执行脚本
fileno获取文件描述符
FileSystem.ReadFile从文件描述符读取结果
pclose关闭
这样既避免了方法一需要写入临时文件的问题,又不像方法二写起来太复杂,Linux真是令人愉快