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全栈框架StrongLoop推荐
Nov 09 NodeJs
nodejs教程之入门
Nov 21 NodeJs
NodeJS中Buffer模块详解
Jan 07 NodeJs
nodejs简单实现中英文翻译
May 04 NodeJs
NodeJs中的VM模块详解
May 06 NodeJs
浅谈Nodejs中的作用域问题
Dec 26 NodeJs
进阶之初探nodeJS
Jan 24 NodeJs
nodejs使用express获取get和post传值及session验证的方法
Nov 09 NodeJs
nodejs express配置自签名https服务器的方法
May 22 NodeJs
详解nodejs 开发企业微信第三方应用入门教程
Mar 12 NodeJs
使用nodeJS中的fs模块对文件及目录进行读写,删除,追加,等操作详解
Feb 06 NodeJs
通过实例了解Nodejs模块系统及require机制
Jul 16 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
Yii实现多数据库主从读写分离的方法
2014/12/29 PHP
php获取开始与结束日期之间所有日期的方法
2016/11/29 PHP
PHP文字转图片功能原理与实现方法分析
2017/08/31 PHP
基于jquery的$.ajax async使用
2011/10/19 Javascript
jquery事件的ready()方法使用详解
2015/11/11 Javascript
JavaScript兼容浏览器FF/IE技巧
2016/08/14 Javascript
jQuery Dialog 取消右上角删除按钮事件
2016/09/07 Javascript
再谈javascript注入 黑客必备!
2016/09/14 Javascript
一个极为简单的requirejs实现方法
2016/10/20 Javascript
基于AngularJS前端云组件最佳实践
2016/10/20 Javascript
jQuery EasyUI 页面加载等待及页面等待层
2017/02/06 Javascript
angular.js+node.js实现下载图片处理详解
2017/03/31 Javascript
微信小程序--组件(swiper)详细介绍
2017/06/13 Javascript
基于JavaScript实现弹幕特效
2020/08/27 Javascript
vue.js移动端app实战1:初始配置详解
2017/07/24 Javascript
简述jQuery Easyui一些用法
2017/08/01 jQuery
浅析js中mvvm模式实现的原理
2018/10/06 Javascript
JS使用百度地图API自动获取地址和经纬度操作示例
2019/04/16 Javascript
js实现贪吃蛇小游戏
2019/10/29 Javascript
Linux 发邮件磁盘空间监控(python)
2016/04/23 Python
python自动重试第三方包retrying模块的方法
2018/04/24 Python
python之super的使用小结
2018/08/13 Python
详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法
2019/08/30 Python
python实现文法左递归的消除方法
2020/05/22 Python
Python爬虫爬取微信朋友圈
2020/08/06 Python
Skyscanner波兰:廉价航班
2017/11/07 全球购物
Becextech新西兰:数码单反相机和手机在线商店
2018/04/27 全球购物
幼师求职自荐信范文
2014/01/26 职场文书
销售人员自我评价
2014/02/01 职场文书
2014年社区妇联工作总结
2014/12/02 职场文书
工厂员工辞职信范文
2015/05/12 职场文书
幼儿园亲子活动感想
2015/08/07 职场文书
《风筝》教学反思
2016/02/23 职场文书
2016年幼儿园万圣节活动总结
2016/04/05 职场文书
一文搞懂如何实现Go 超时控制
2021/03/30 Python
Windows Server 2008 修改远程登录端口以及配置防火墙
2022/04/28 Servers