Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例


Posted in NodeJs onJanuary 01, 2015

每种语言都有自己的优势,互相结合起来各取所长程序执行起来效率更高或者说哪种实现方式较简单就用哪个,nodejs是利用子进程来调用系统命令或者文件,文档见http://nodejs.org/api/child_process.html,NodeJS子进程提供了与系统交互的重要接口,其主要API有: 标准输入、标准输出及标准错误输出的接口。

 

NodeJS 子进程提供了与系统交互的重要接口,其主要 API 有:

 

标准输入、标准输出及标准错误输出的接口

child.stdin 获取标准输入
child.stdout 获取标准输出
child.stderr 获取标准错误输出
获取子进程的PID:child.pid
提供生成子进程的方法:child_process.spawn(cmd, args=[], [options])
提供直接执行系统命令的方法:child_process.exec(cmd, [options], callback)
提供调用脚本文件的方法:child_process.execFile(file, [args], [options], [callback])
提供杀死进程的方法:child.kill(signal='SIGTERM')

 

用实例来感受一下,很有意思的,呵呵~~

 

1、利用子进程调用系统命令(获取系统内存使用情况)

 

新建nodejs文件,名为cmd_spawn.js,代码如下:

var spawn = require('child_process').spawn;

free = spawn('free', ['-m']);
// 捕获标准输出并将其打印到控制台 

free.stdout.on('data', function (data) { 

console.log('standard output:\n' + data); 

});
// 捕获标准错误输出并将其打印到控制台 

free.stderr.on('data', function (data) { 

console.log('standard error output:\n' + data); 

});
// 注册子进程关闭事件 

free.on('exit', function (code, signal) { 

console.log('child process eixt ,exit:' + code); 

});

下面是运行该脚本和直接运行命令'free -m'的结果,一模一样:

 

Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例

 

2、执行系统命令(child_process.exec())

 

这个我还是很常用的,功能感觉比上面的强大那么一点点。比如我很喜欢关注天气,现在我要curl一下天气的接口返回json格式的数据,可能我要对它进行一番操作,这里就打印出来不操作。

新建nodejs文件,名为cmd_exec.js:

var exec = require('child_process').exec; 

var cmdStr = 'curl http://www.weather.com.cn/data/sk/101010100.html';

exec(cmdStr, function(err,stdout,stderr){

    if(err) {

        console.log('get weather api error:'+stderr);

    } else {

        /*

        这个stdout的内容就是上面我curl出来的这个东西:

        {"weatherinfo":{"city":"北京","cityid":"101010100","temp":"3","WD":"西北风","WS":"3级","SD":"23%","WSE":"3","time":"21:20","isRadar":"1","Radar":"JC_RADAR_AZ9010_JB","njd":"暂无实况","qy":"1019"}}

        */

        var data = JSON.parse(stdout);

        console.log(data);

    }

});

来感受一下直接curl出来和通过运行脚本的出来的结果是一样一样的:

 

Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例

 

3、调用传参数的shell脚本(child_process.execFile())

 

这个要先准备个shell脚本,比如我要连到一台服务器,来修改它的密码,则我要提供IP,user,new pwd,old pwd,新建shell脚本文件change_password.sh:

#!/bin/sh
IP=""

NAME=""

PASSWORD=""

NEWPASSWORD=""
while getopts "H:U:P:N:" arg #选项后面的冒号表示该选项需要参数

do

        case $arg in

             H)

                IP=$OPTARG

                ;;

             U)

                NAME=$OPTARG

                ;;

             P)

                PASSWORD=$OPTARG

                ;;

             N)

                NEWPASSWORD=$OPTARG

                ;;

             ?)  #当有不认识的选项的时候arg为?

            echo "含有未知参数"

        exit 1

        ;;

        esac

done
#先获取userid

USERID=`/usr/bin/ipmitool -I lanplus -H $IP -U $NAME -P $PASSWORD user list | grep root | awk '{print $1}'`

# echo $USERID

#根据userid来修改密码

/usr/bin/ipmitool -I lanplus -H $IP -U $NAME -P $PASSWORD user set password $USERID $NEWPASSWORD

然后我准备个nodejs文件来调用这个shell脚本,叫file_changepwd.js:

var callfile = require('child_process'); 

var ip = '1.1.1.1';

var username = 'test';

var password = 'pwd';

var newpassword = 'newpwd';
callfile.execFile('change_password.sh',['-H', ip, '-U', username, '-P', password, '-N', newpassword],null,function (err, stdout, stderr) {

    callback(err, stdout, stderr);

});

这里就不方便贴运行结果了,不过我可以用人格保证,它是经过测试的。

看过上面的,其实调用python脚本就没什么悬念了,本质上也就是执行命令。

 

4、调用python脚本(python脚本本身是传参数的)

 

这里插入一个题外话,下面这段是对python传参数的简单说明一下:

# -*-coding:utf-8 -*-

'''

需要模块:sys

参数个数:len(sys.argv)

脚本名:    sys.argv[0]

参数1:     sys.argv[1]

参数2:     sys.argv[2]

'''

import sys

print u"脚本名:", sys.argv[0]

for i in range(1, len(sys.argv)):#这里参数从1开始

    print u"参数", i, sys.argv[i]

 

运行结果:

Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例

我也来准备一个nodejs文件来调用这个python脚本(我对py_test.py做了修改,见下面),file_python.js:

var exec = require('child_process').exec;

var arg1 = 'hello'

var arg2 = 'jzhou'

exec('python py_test.py '+ arg1+' '+arg2+' ',function(error,stdout,stderr){

    if(stdout.length >1){

        console.log('you offer args:',stdout);

    } else {

        console.log('you don\'t offer args');

    }

    if(error) {

        console.info('stderr : '+stderr);

    }

});
py_test.py内容如下:

# -*-coding:utf-8 -*-

import sys

print sys.argv

运行结果如下:

Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例

还是挺赞的,又为2014完成了一篇精致的博客。哈哈~~

NodeJs 相关文章推荐
Nodejs的express使用教程
Nov 23 NodeJs
详解nodejs 文本操作模块-fs模块(三)
Dec 22 NodeJs
nodejs基础知识
Feb 03 NodeJs
Nodejs多站点切换Htpps协议详解及简单实例
Feb 23 NodeJs
nodejs批量下载图片的实现方法
May 19 NodeJs
Express+Nodejs 下的登录拦截实现代码
Jul 01 NodeJs
Nodejs之http的表单提交
Jul 07 NodeJs
Nodejs中使用phantom将html转为pdf或图片格式的方法
Sep 18 NodeJs
nodejs图片处理工具gm用法小结
Dec 12 NodeJs
nodejs log4js 使用详解
May 31 NodeJs
typescript nodejs 依赖注入实现方法代码详解
Jul 21 NodeJs
nodejs实现聊天机器人功能
Sep 19 NodeJs
nodejs中实现路由功能
Dec 29 #NodeJs
NodeJS制作爬虫全过程(续)
Dec 22 #NodeJs
NodeJS制作爬虫全过程
Dec 22 #NodeJs
nodejs中操作mysql数据库示例
Dec 20 #NodeJs
轻松创建nodejs服务器(10):处理上传图片
Dec 18 #NodeJs
轻松创建nodejs服务器(10):处理POST请求
Dec 18 #NodeJs
轻松创建nodejs服务器(7):阻塞操作的实现
Dec 18 #NodeJs
You might like
Sublime里直接运行PHP配置方法
2014/11/28 PHP
Yii1.1中通过Sql查询进行的分页操作方法
2017/03/16 PHP
用PHP去掉文件头的Unicode签名(BOM)方法
2017/06/22 PHP
javascript 写类方式之一
2009/07/05 Javascript
jQuery 处理网页内容的实现代码
2010/02/15 Javascript
jquery 仿QQ校友的DIV模拟窗口效果源码
2010/03/24 Javascript
asp.net下使用jquery 的ajax+WebService+json 实现无刷新取后台值的实现代码
2010/09/19 Javascript
JavaScript利用构造函数和原型的方式模拟C#类的功能
2014/03/06 Javascript
jsPDF导出pdf示例
2014/05/02 Javascript
Lab.js初次使用笔记
2015/02/28 Javascript
Javascript中For In语句用法实例
2015/05/14 Javascript
jQuery使用DataTable实现删除数据后重新加载功能
2017/02/27 Javascript
angularjs定时任务的设置与清除示例
2017/06/02 Javascript
js分页之前端代码实现和请求处理
2017/08/04 Javascript
浅谈JavaScript find 方法不支持IE的问题
2017/09/28 Javascript
在 Angular中 使用 Lodash 的方法
2018/02/11 Javascript
JavaScript中call和apply方法的区别实例分析
2018/08/03 Javascript
vue移动端微信授权登录插件封装的实例
2018/08/28 Javascript
解决layer 动态加载select 失效的问题
2019/09/18 Javascript
vue实现百度语音合成的实例讲解
2019/10/14 Javascript
javascript实现异形滚动轮播
2019/11/28 Javascript
微信小程序实现发微博功能的示例代码
2020/06/24 Javascript
python实现堆栈与队列的方法
2015/01/15 Python
Python中工作日类库Busines Holiday的介绍与使用
2017/07/06 Python
人脸识别经典算法一 特征脸方法(Eigenface)
2018/03/13 Python
numpy中以文本的方式存储以及读取数据方法
2018/06/04 Python
Python 线性回归分析以及评价指标详解
2020/04/02 Python
Python监听剪切板实现方法代码实例
2020/11/11 Python
简历的个人自我评价范文
2014/01/03 职场文书
员工培训邀请函
2014/01/11 职场文书
作风建设年活动总结
2014/08/27 职场文书
2015元旦联欢晚会结束语
2014/12/14 职场文书
辛德勒的名单观后感
2015/06/03 职场文书
基于python的matplotlib制作双Y轴图
2021/04/20 Python
排查并解决MySQL生产库内存使用率高的报警
2022/04/11 MySQL
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
2022/04/13 Python