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教程之环境安装及运行
Nov 21 NodeJs
Nodejs Stream 数据流使用手册
Apr 17 NodeJs
NodeJS连接MongoDB数据库时报错的快速解决方法
May 13 NodeJs
nodejs学习笔记之路由
Mar 27 NodeJs
初识NodeJS服务端开发入门(Express+MySQL)
Apr 07 NodeJs
nodejs入门教程一:概念与用法简介
Apr 24 NodeJs
Nodejs中使用captchapng模块生成图片验证码
May 18 NodeJs
Nodejs回调加超时限制两种实现方法
Jun 09 NodeJs
nodejs用gulp管理前端文件方法
Jun 24 NodeJs
nodejs更新package.json中的dependencies依赖到最新版本的方法
Oct 10 NodeJs
nodeJs项目在阿里云的简单部署
Nov 27 NodeJs
NodeJS和浏览器中this关键字的不同之处
Mar 03 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
用PHP创建PDF中文文档
2006/10/09 PHP
php对二维数组进行相关操作(排序、转换、去空白等)
2015/11/04 PHP
WordPress中用于获取搜索表单的PHP函数使用解析
2016/01/05 PHP
php利用嵌套数组拼接与解析json的方法
2017/02/07 PHP
PHP数组对象与Json转换操作实例分析
2019/10/22 PHP
javascript 框架小结 个人工作经验
2009/06/13 Javascript
JavaScript 学习笔记(七)字符串的连接
2009/12/31 Javascript
jQuery实现的网格线绘制方法
2016/06/20 Javascript
jQuery soColorPacker 网页拾色器
2016/06/22 Javascript
AngularJS中的API(接口)简单实现
2016/07/28 Javascript
详解nodejs微信公众号开发——5.素材管理接口
2017/04/11 NodeJs
微信小程序 共用变量值的实现
2017/07/12 Javascript
jquery.onoff实现简单的开关按钮功能(推荐)
2018/05/24 jQuery
Vue组件内部实现一个双向数据绑定的实例代码
2019/04/04 Javascript
Vue实现push数组并删除的例子
2019/11/01 Javascript
基于jQuery实现可编辑的表格
2019/12/11 jQuery
JS实现网页端猜数字小游戏
2020/03/06 Javascript
基于JQuery和DWR实现异步数据传递
2020/10/16 jQuery
详解用python写一个抽奖程序
2019/05/10 Python
基于Python解密仿射密码
2019/10/21 Python
PYTHON发送邮件YAGMAIL的简单实现解析
2019/10/28 Python
python通用读取vcf文件的类(复制粘贴即可用)
2020/02/29 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
pandas处理csv文件的方法步骤
2020/10/16 Python
美国精品家居用品网站:US-Mattress
2016/08/24 全球购物
L’AGENCE官网:加州女装品牌
2018/06/03 全球购物
英国儿童鞋和靴子:Start-Rite
2019/05/06 全球购物
医务人员竞聘职务自我评价分享
2013/11/08 职场文书
给领导的致歉信范文
2014/01/13 职场文书
售前工程师职业生涯规划
2014/03/02 职场文书
教师个人工作总结范文2014
2014/11/10 职场文书
销售人员管理制度
2015/08/06 职场文书
2016年教代会开幕词
2016/03/04 职场文书
导游词之鲁迅祖居
2019/10/17 职场文书
解决linux下redis数据库overcommit_memory问题
2022/02/24 Redis
TV动画《史上最强大魔王转生为村民A》番宣CM公布
2022/04/01 日漫