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的前后端分离的思考与实践(四)安全问题解决方案
Sep 26 NodeJs
Nodejs极简入门教程(二):定时器
Oct 25 NodeJs
nodejs接入阿里大鱼短信验证码的方法
Jul 10 NodeJs
nodejs构建本地web测试服务器 如何解决访问静态资源问题
Jul 14 NodeJs
nodejs实现爬取网站图片功能
Dec 14 NodeJs
nodejs读取并去重excel文件
Apr 22 NodeJs
nodejs 日志模块winston的使用方法
May 02 NodeJs
NodeJS实现自定义流的方法
Aug 01 NodeJs
Nodejs调用Dll模块的方法
Sep 17 NodeJs
nodejs实现获取本地文件夹下图片信息功能示例
Jun 22 NodeJs
详解NodeJs项目 CentOs linux服务器线上部署
Sep 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
session在PHP大型web应用中的使用
2011/06/25 PHP
php中的filesystem文件系统函数介绍及使用示例
2014/02/13 PHP
php switch语句多个值匹配同一代码块应用示例
2014/07/29 PHP
PHP获取表单所有复选框的值的方法
2014/08/28 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
2020/02/21 PHP
JavaScript的strict模式与with关键字介绍
2014/02/08 Javascript
使用ajaxfileupload.js实现ajax上传文件php版
2014/06/26 Javascript
jQuery遍历之next()、nextAll()方法使用实例
2014/11/08 Javascript
jQuery实现为控件添加水印文字效果(附源码)
2015/12/02 Javascript
原生JS实现平滑回到顶部组件
2016/03/16 Javascript
jQuery实现侧浮窗与中浮窗切换效果的方法
2016/09/05 Javascript
vue打包后显示空白正确处理方法
2017/11/01 Javascript
详解vue指令与$nextTick 操作DOM的不同之处
2018/08/02 Javascript
javascript实现鼠标点击生成文字特效
2019/12/24 Javascript
JavaScript文档加载模式以及元素获取
2020/07/28 Javascript
如何利用JavaScript编写一个格斗小游戏
2021/01/06 Javascript
[04:19]DOTA2完美大师赛第四天精彩集锦
2017/11/26 DOTA
[01:08:32]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第二场 1月18日
2021/03/11 DOTA
Python基于DES算法加密解密实例
2015/06/03 Python
python正则表达式去除两个特殊字符间的内容方法
2018/12/24 Python
Pytorch Tensor 输出为txt和mat格式方式
2020/01/03 Python
pytorch中的上采样以及各种反操作,求逆操作详解
2020/01/03 Python
python简单的三元一次方程求解实例
2020/04/02 Python
Python读取ini配置文件传参的简单示例
2021/01/05 Python
世界领先的豪华床上用品供应商之一:Bedeck Home
2019/03/18 全球购物
银行毕业实习自我鉴定
2013/09/19 职场文书
大学生职业生涯规划书汇总
2014/03/20 职场文书
上课不认真检讨书
2014/09/17 职场文书
拾金不昧感谢信范文
2015/01/21 职场文书
教师年度考核个人总结
2015/02/12 职场文书
2016清明节森林防火广播稿
2015/12/17 职场文书
python实现简单区块链结构
2021/04/25 Python
MySQL时间盲注的五种延时方法实现
2021/05/18 MySQL
解析探秘fescar分布式事务实现原理
2022/02/28 Java/Android
Django框架中模型的用法
2022/06/10 Python