使用Node.js执行命令行二进制文件

使用Node.js执行命令行二进制文件

我正在将CLI库从Ruby移植到Node.js。在我的代码中,我在必要时执行几个第三方二进制文件。我不知道如何在Node中最好地完成这一任务。

下面是Ruby中的一个示例,其中我调用prineXML将文件转换为PDF:

cmd = system("prince -v builds/pdf/book.html -o builds/pdf/book.pdf")

Node中的等效代码是什么?


catspeake
浏览 858回答 2
2回答

MYYA

对于新版本的Node.js(v8.1.4),事件和调用与旧版本相似或相同,但鼓励使用标准的更新语言特性。例子:对于缓冲的、非流格式的输出(一次性获得全部输出),请使用child_process.exec:const { exec } = require('child_process');exec('cat *.js bad_file | wc -l', (err, stdout, stderr) => {   if (err) {     // node couldn't execute the command     return;   }   // the *entire* stdout and stderr (buffered)   console.log(`stdout: ${stdout}`);   console.log(`stderr: ${stderr}`);});您也可以将其用于承诺:const util = require('util');const exec = util.promisify(require('child_process').exec);async function ls() {   const { stdout, stderr } = await exec('ls');   console.log('stdout:', stdout);   console.log('stderr:', stderr);}ls();如果您希望以块的形式逐步接收数据(输出为流),请使用child_process.spawn:const { spawn } = require('child_process');const child = spawn('ls', ['-lh', '/usr']);// use child.stdout.setEncoding('utf8');  if you want text chunkschild.stdout.on('data', (chunk) => {   // data from standard output is here as buffers});// since these are streams, you can pipe them elsewherechild.stderr.pipe(dest);   child.on('close', (code) => {   console.log(`child process exited with code ${code}`);});这两个函数都具有同步对应。一个例子child_process.execSync:const { execSync } = require('child_process');// stderr is sent to stderr of parent proces s// you can set options.stdio if you want it to go elsewherelet stdout = execSync('ls');以及child_process.spawnSync:const { spawnSync} = require('child_process');const child = spawnSync('ls', ['-lh', '/usr']);console.log('error', child.error); console.log('stdout ', child.stdout);console.log('stderr ', child.stderr);注:下面的代码仍然可以使用,但主要针对ES5和之前的用户。使用Node.js生成子进程的模块在文献资料(5.0.0节)。若要执行命令并将其完整输出作为缓冲区获取,请使用child_process.exec:var exec = require('child_process').exec;var cmd = 'prince -v builds/pdf/book.html -o builds/pdf/book.pdf'; exec(cmd, function(error, stdout, stderr) {   // command output is in stdout});如果您需要在流中处理流程I/O,例如当您期望获得大量的输出时,请使用child_process.spawn:var spawn = require('child_process').spawn;var child = spawn('prince', [   '-v', 'builds/pdf/book.html',   '-o', 'builds/pdf/book.pdf']);child.stdout.on('data', function(chunk) {   // output will be here in chunks});// or if you want to send output elsewherechild.stdout.pipe(dest);如果正在执行文件而不是命令,则可能需要使用child_process.execFile,哪些参数几乎与spawn,但是有第四个回调参数,如exec用于检索输出缓冲区。看起来可能有点像这样:var execFile = require('child_process').execFile;execFile(file, args, options, function(error, stdout, stderr) {   // command output is in stdout});截至v0.11.12,Node现在支持同步。spawn和exec..上面描述的所有方法都是异步的,并且具有同步对应。他们的文件可以找到这里..虽然它们对脚本很有用,但请注意,与异步生成子进程所用的方法不同,同步方法不返回ChildProcess.
打开App,查看更多内容
随时随地看视频慕课网APP