Node.js执行系统命令
原文發表在我的博客 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類的特定語言的腳本,一定在開頭指定解釋器程序路徑
請參考:execFile配置,execFileSync配置
三、spawn與spawnSync
??child_process模塊中所有函數都是基于spawn和spawnSync函數的來實現的,換句話來說,spawn和spawnSync函數的配置是最完全的,其它函數都是對其做了封裝和修改。下面我們來重點講解一下: ??spawn函數原型是這樣的:child_process.spawn(command[, args][, options])
??它使用指定的命令行參數創建新進程,spawn 會返回一個帶有stdout和stderr流的對象。你可以通過stdout流來讀取子進程返回給Node.js的數據。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);}}); }); 復制代碼總結
以上是生活随笔為你收集整理的Node.js执行系统命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前华为技术大牛告诉你:如何正确入门深度学
- 下一篇: 阿里云有一群 “猪猪侠”