Linux里JSA执行脚本并获取其输出的第三种方法

wils
wils Lv.2 潜力创作者

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真是令人愉快

广东省
浏览 113
收藏
8
分享
8 +1
+1
全部评论