node.js向非js子进程shell发送命令

nc1teljy  于 2023-03-08  发布在  Node.js
关注(0)|答案(1)|浏览(165)

我正在使用node.js中的inkscape CLI,这已经很好地工作了,我听说如果我使用inkscape的--shell参数,性能会更好,所以这个想法是让一个进程保持打开状态,只要我想向孩子发送命令,就可以执行命令。
我尝试使用spawn(这个命令确实打开了一个svg文件):

const child = spawn(`${inkscapePath} "${projectPathSvg}"`, { shell: true })

如果我不使用shell:true,它看起来好像什么都没做,使用shell:true会打开一个inkscape标签,但没有窗口,但无论如何,这并没有做很多事情,当我尝试使用child.send(命令)时,我得到一个错误:

关于如何处理这个问题有什么想法或教程吗?谢谢!

gz5pxeao

gz5pxeao1#

inkscape --shellspawn中的shell是完全不同的,后者只是意味着您在一个新的shell中运行进程,如bash。对于inkscape,--shell意味着您将被置于一个REPL shell中,在那里您可以向正在运行的inkscape进程发送命令。
此外,您所指的child.send仅在与子进程建立IPC通道时才起作用,而在spawn中不会发生这种情况,只有在fork中才起作用,而fork仅在子进程再次成为nodejs进程时才起作用。
看起来你真正想做的是与inkscape --shell的开放shell进程通信,从nodejs以编程方式发送命令,为此你需要使用spawn设置的stdin和stdout管道。
类似这样的方法可能有效:

const inkscape = spawn('inkscape', ['--shell']);
inkscape.stdin.write('my-inkscape-command');

不确定inkscape是否有比这更合适的API,但这种方法似乎值得探索。

相关问题