Первоначально опубликовано в моем блогеNode.js выполняет системные команды | эфирное пространство
Когда мы используем Node.js, нам всегда нужно выполнять какие-то системные команды, взаимодействовать с системой или вызывать другие языки, что нам делать в это время?
, конечно, используетchild_processМодуль переводится как подпроцесс.Конечно, как следует из названия, этот модуль в основном функционирует, генерируя подпроцессы.Давайте рассмотрим это на примере.
один,execа такжеexecSync
Этоchild_processСамая простая функция в модуле — выполнение фиксированной системной команды.
const { exec } = require('child_process');
// 输出当前目录(不一定是代码所在的目录)下的文件和文件夹
exec('ls -l', (err, stdout, stderr) => {
if(err) {
console.log(err);
return;
}
console.log(`stdout: ${stdout}`);
console.log(`stderr: ${stderr}`);
})
execПервый параметр функции — это выполняемая команда, вторая функция — параметр конфигурации, третий параметр — функция обратного вызова, а один из наиболее часто используемых вторых параметров — рабочий каталог дочернего процесса.
const { exec } = require('child_process');
const path = require('path'):
// 在当前目录下的scripts文件夹里执行hexo g命令
exec('hexo g', { cwd: path.join(process.cwd(), 'scripts') }, (err, stdout, stderr) => {
if(err) {
console.log(err);
return;
}
console.log(`stdout: ${stdout}`);
});
execSyncдаexecсинхронная версия , но либоexecSyncещеexec, полученные результаты представляют собой все строки или объекты Buffer, которые обычно требуют дальнейшей обработки.
Пожалуйста, обратитесь к:
execКонкретная конфигурация,execSyncКонкретная конфигурация
два,execFileа такжеexecFileSync
Роль этих двух функций заключается в выполнении исполняемого файла, см. следующий пример:
const { execFile, execFileSync } = require('child_process');
execFile('example.py', [], (err, stdout, stderr) => {
if(err) {
console.log(err);
return;
}
console.log(`stdout: ${stdout}`);
});
const stdout = execFileSync('node', ['-v']);
console.log(stdout);
а такжеexecТочно так же первый параметр — это путь к файлу, который нужно выполнить, второй — массив параметров, третий — конфигурация, а четвертый — функция обратного вызова, конечно, за исключением того, что первый можно опустить.
Примечание. Исполняемый файл должен иметь права на выполнение, если он аналогичен
.pyСценарий класса для конкретного языка должен указывать путь к программе интерпретатора в начале.
Пожалуйста, обратитесь к:execFileConfiguration,конфигурация execFileSync
три,spawnа такжеspawnSync
child_processВсе функции модуля основаны наspawnа такжеspawnSyncреализовать функцию, другими словами,spawnа такжеspawnSyncКонфигурация функции является наиболее полной, а остальные функции инкапсулированы и изменены. Давайте сосредоточимся на:
spawnПрототип функции выглядит так:child_process.spawn(command[, args][, options])
Создает новый процесс с указанными аргументами командной строки, spawn возвращает объект с потоками stdout и stderr. Вы можете прочитать данные, возвращенные дочерним процессом в Node.js, через поток stdout. stdout владеет'data','end'И события, которые есть в общем потоке. Если вы хотите, чтобы дочерний процесс возвращал Node много данных, таких как обработка изображений, чтение двоичных данных и т. д., вам лучше использовать метод spawn.
const {spawn} = require('child_process');
const fs = require('fs');
const spawnObj = spawn('ping', ['127.0.0.1'], {encoding: 'utf-8'});
spawnObj.stdout.on('data', function(chunk) {
console.log(chunk.toString());
});
spawnObj.stderr.on('data', (data) => {
console.log(data);
});
spawnObj.on('close', function(code) {
console.log('close code : ' + code);
})
spawnObj.on('exit', (code) => {
console.log('exit code : ' + code);
fs.close(fd, function(err) {
if(err) {
console.error(err);
}
});
});