如何在Node.js中执行外部程序?

157

是否可以从node.js中执行外部程序?是否有类似于Python的os.system()的等效方法或任何可以添加此功能的库?


你想要使用 child_process 模組。 請查看文檔,其中提供了幾個明確的不同用例範例。 - kqnr
5个回答

151
var exec = require('child_process').exec;
exec('pwd', function callback(error, stdout, stderr) {
  // result
});

2
什么是在子进程结果上采取行动的最佳方法。例如...如果进程返回退出代码0,并且我想调用不同的方法,我似乎会遇到大量错误。 - continuousqa
@continuousqa -- 这个回答已经有4年了。如果你有问题,请在SO上发布一个新的问题,并在必要时引用这个问题。 - user578895
1
这篇文章提供了使用child_process的好建议。 - Adriano P

88

exec在缓冲区大小上有512k的内存限制。在这种情况下,最好使用spawn。使用spawn可以在运行时访问执行命令的stdout。

exec具有512k缓冲区大小的内存限制,因此建议使用spawn。使用spawn运行命令时可以即时访问stdout。

var spawn = require('child_process').spawn;
var prc = spawn('java',  ['-jar', '-Xmx512M', '-Dfile.encoding=utf8', 'script/importlistings.jar']);

//noinspection JSUnresolvedFunction
prc.stdout.setEncoding('utf8');
prc.stdout.on('data', function (data) {
    var str = data.toString()
    var lines = str.split(/(\r?\n)/g);
    console.log(lines.join(""));
});

prc.on('close', function (code) {
    console.log('process exit code ' + code);
});

1
我拿了这段代码,但它无法显示生成的进程输出 http://stackoverflow.com/questions/21302350/node-js-cant-get-output-of-spawned-process - Paul Verest
1
@PaulVerest:你的输出可能存在于stderr而不是stdout中。但在我的情况下,close从未到来...... - hippietrail
1
关于标准输入(stdin)怎么样?有没有可能向进程发送数据? - Hernán Eche

22

最简单的方法是:

const { exec } = require("child_process")
exec('yourApp').unref()

unref是必要的,以便无需等待"yourApp"即可结束您的进程。

这里是exec文档


5

1
使用utils promisify的import语句:
import { exec } from 'child_process';
import utils from 'util';

const execute = utils.promisify(exec);
console.log(await execute('pwd'));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接