Первоначально опубликовано в моем блоге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);
}
});
});