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中的fiber(纤程)库详解
Mar 24 NodeJs
nodeJs链接Mysql做增删改查的简单操作
Feb 04 NodeJs
详谈Angular路由与Nodejs路由的区别
Mar 05 NodeJs
NodeJS爬虫实例之糗事百科
Dec 14 NodeJs
Nodejs 发布自己的npm包并制作成命令行工具的实例讲解
May 15 NodeJs
nodejs aes 加解密实例
Oct 10 NodeJs
NodeJS搭建HTTP服务器的实现步骤
Oct 12 NodeJs
NodeJs操作MongoDB教程之分页功能以及常见问题
Apr 09 NodeJs
nodejs简单抓包工具使用详解
Aug 23 NodeJs
NodeJS开发人员常见五个错误理解
Oct 14 NodeJs
ubuntu系统下使用pm2设置nodejs开机自启动的方法
May 12 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程序的国际化实现方法(利用gettext)
2011/08/14 PHP
PHP类与对象中的private访问控制的疑问
2012/11/01 PHP
浅析ThinkPHP中的pathinfo模式和URL重写
2014/01/06 PHP
兼容PHP和Java的des加密解密代码分享
2014/06/26 PHP
如何打开php的gd2库
2017/02/09 PHP
php+redis实现注册、删除、编辑、分页、登录、关注等功能示例
2017/02/15 PHP
php在linux环境中如何使用redis详解
2020/12/15 PHP
js 判断 enter 事件
2009/02/12 Javascript
JavaScript Event学习第七章 事件属性
2010/02/07 Javascript
jQuery 选择器、DOM操作、事件、动画
2010/11/25 Javascript
jquery实现炫酷的叠加层自动切换特效
2015/02/01 Javascript
JavaScript的9种继承实现方式归纳
2015/05/18 Javascript
jQuery+jsp下拉框联动获取本地数据的方法(附源码)
2015/12/03 Javascript
详解原生JavaScript实现jQuery中AJAX处理的方法
2016/05/10 Javascript
node网页分段渲染详解
2016/09/05 Javascript
js在ie下打开对话窗口的方法小结
2016/10/24 Javascript
深入理解Nodejs Global 模块
2017/06/03 NodeJs
JS闭包原理与应用经典示例
2018/12/20 Javascript
[46:00]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第一局
2016/03/03 DOTA
分析python服务器拒绝服务攻击代码
2014/01/16 Python
python3+PyQt5使用数据库窗口视图
2018/04/24 Python
详解Python中的正则表达式
2018/07/08 Python
Python2.7实现多进程下开发多线程示例
2019/05/31 Python
Django url,从一个页面调到另个页面的方法
2019/08/21 Python
Python Pillow(PIL)库的用法详解
2020/09/19 Python
python 实现性别识别
2020/11/21 Python
html5 worker 实例(二) 图片变换效果
2013/06/24 HTML / CSS
缓解脚、腿和背部疼痛:Z-CoiL鞋
2019/03/12 全球购物
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
学生自我鉴定
2013/12/18 职场文书
党的群众路线对照检查材料
2014/08/27 职场文书
2014年财务科工作总结
2014/11/11 职场文书
离婚撤诉申请书范本
2015/05/18 职场文书
2015年测量员工作总结
2015/05/23 职场文书
初中毕业感言300字
2015/07/31 职场文书
关于Python OS模块常用文件/目录函数详解
2021/07/01 Python