宿舍里有中国联通wlan上网服务的覆盖wlan但是连上了用不了,现在只有移动卡,怎么才能用wlan

Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例
投稿:junjie
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例,本文给出了利用子进程调用系统命令、执行系统命令、调用传参数的shell脚本、调用python脚本的例子,需要的朋友可以参考下
每种语言都有自己的优势,互相结合起来各取所长程序执行起来效率更高或者说哪种实现方式较简单就用哪个,nodejs是利用子进程来调用系统命令或者文件,文档见,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').
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'的结果,一模一样:
2、执行系统命令(child_process.exec())
这个我还是很常用的,功能感觉比上面的强大那么一点点。比如我很喜欢关注天气,现在我要curl一下天气的接口返回json格式的数据,可能我要对它进行一番操作,这里就打印出来不操作。
新建nodejs文件,名为cmd_exec.js:
var exec = require('child_process').
var cmdStr = 'curl .cn/data/sk/.html';
exec(cmdStr, function(err,stdout,stderr){
&&& if(err) {
&&&&&&& console.log('get weather api error:'+stderr);
&&& } else {
&&&&&&& /*
&&&&&&& 这个stdout的内容就是上面我curl出来的这个东西:
&&&&&&& {"weatherinfo":{"city":"北京","cityid":"","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出来和通过运行脚本的出来的结果是一样一样的:
3、调用传参数的shell脚本(child_process.execFile())
这个要先准备个shell脚本,比如我要连到一台服务器,来修改它的密码,则我要提供IP,user,new pwd,old pwd,新建shell脚本文件change_password.sh:
PASSWORD=""
NEWPASSWORD=""
while getopts "H:U:P:N:" arg #选项后面的冒号表示该选项需要参数
&&&&&&& case $arg in
&&&&&&&&&&&& H)
&&&&&&&&&&&&&&& IP=$OPTARG
&&&&&&&&&&&&&&& ;;
&&&&&&&&&&&& U)
&&&&&&&&&&&&&&& NAME=$OPTARG
&&&&&&&&&&&&&&& ;;
&&&&&&&&&&&& P)
&&&&&&&&&&&&&&& PASSWORD=$OPTARG
&&&&&&&&&&&&&&& ;;
&&&&&&&&&&&& N)
&&&&&&&&&&&&&&& NEWPASSWORD=$OPTARG
&&&&&&&&&&&&&&& ;;
&&&&&&&&&&&& ?)& #当有不认识的选项的时候arg为?
&&&&&&&&&&& echo "含有未知参数"
&&&&&&& exit 1
&&&&&&& ;;
&&&&&&& esac
#先获取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文件来调用这个python脚本(我对py_test.py做了修改,见下面),file_python.js:
var exec = require('child_process').
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) {
&&&&&&& ('stderr : '+stderr);
py_test.py内容如下:
# -*-coding:utf-8 -*-
import sys
print sys.argv
运行结果如下:
还是挺赞的,又为2014完成了一篇精致的博客。哈哈~~
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
‘’‘[root@mydesktop plugins]# nohup python xxxx.py nohup: 忽略输入并把输出追加到"nohup.out"’‘’
如图,如何在不终止该进程(ctrl+c)的情况下,还能继续命令行的其他操作?现在光标就停留在下一行,无法运行其他命令了。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
在nohup命令后面加上"&"字符放到后台执行,即nohup python xxxx.py &,然后按几下回车就好了
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
再打开一个终端
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
Ctrl-Z,切换到后台,一会可以通过fg返回。
同步到新浪微博
分享到微博?
Hi,欢迎来到 SegmentFault 技术社区!⊙▽⊙ 在这里,你可以提出编程相关的疑惑,关注感兴趣的问题,对认可的回答投赞同票;大家会帮你解决编程的问题,和你探讨技术更新,为你的回答投上赞同票。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 App1282人阅读
Python(8)
tensorflow(21)
三种常用的方式
如果在运行python脚本时需要传入一些参数,例如gpus与batch_size,可以使用如下三种方式。
python script.py 0,1,2 10
python script.py -gpus=0,1,2
python script.py -gpus=0,1,2
这三种格式对应不同的参数解析方式,分别为sys.argv, argparse, tf.app.run, 前两者是python自带的功能,后者是tensorflow提供的便捷方式。
sys模块是很常用的模块, 它封装了与python解释器相关的数据,例如sys.modules里面有已经加载了的所有模块信息,sys.path里面是PYTHONPATH的内容,而sys.argv则封装了传入的参数数据。
使用sys.argv接收上面第一个命令中包含的参数方式如下:
import sys
gpus = sys.argv[1]
#gpus = [int(gpus.split(','))]
batch_size = sys.argv[2]
print gpus
print batch_size
import argparse
parser = argparse.ArgumentParser(description='manual to this script')
parser.add_argument('--gpus', type=str, default = None)
parser.add_argument('--batch-size', type=int, default=32)
args = parser.parse_args()
print args.gpus
print args.batch_size
需要注意的是,脚本运行命令python script.py -gpus=0,1,2 --batch-size=10中的--batch-size会被自动解析成batch_size.
parser.add_argument 方法的type参数理论上可以是任何合法的类型, 但有些参数传入格式比较麻烦,例如list,所以一般使用bool, int, str, float这些基本类型就行了,更复杂的需求可以通过str传入,然后手动解析。bool类型的解析比较特殊,传入任何值都会被解析成True,传入空值时才为False
python script.py --bool-val=0 # args.bool_val=True
python script.py --bool-val=False # args.bool_val=True
python script.py --bool-val=
# args.bool_val=什么都不写False
通过这个方法还能指定命令的帮助信息。具体请看API文档:
tf.app.run
tensorflow也提供了一种方便的解析方式。
脚本的执行命令为:
python script.py -gpus=0,1,2
对应的python代码为:
import tensorflow as tf
tf.app.flags.DEFINE_string('gpus', None, 'gpus to use')
tf.app.flags.DEFINE_integer('batch_size', 5, 'batch size')
FLAGS = tf.app.flags.FLAGS
def main(_):
print FLAGS.gpus
print FLAGS.batch_size
if __name__=="__main__":
tf.app.run()
有几点需要注意:
tensorflow只提供以下几种方法:
tf.app.flags.DEFINE_string,
tf.app.flags.DEFINE_integer,
tf.app.flags.DEFINE_boolean,
tf.app.flags.DEFINE_float 四种方法,分别对应str, int,bool,float类型的参数。这里对bool的解析比较严格,传入1会被解析成True,其余任何值都会被解析成False。
脚本中需要定义一个接收一个参数的main方法:def main(_):,这个传入的参数是脚本名,一般用不到, 所以用下划线接收。
以batch_size参数为例,传入这个参数时使用的名称为--batch_size,也就是说,中划线不会像在argparse
中一样被解析成下划线。
tf.app.run()会寻找并执行入口脚本的main方法。也只有在执行了tf.app.run()之后才能从FLAGS中取出参数。
从它的签名来看,它也是可以自己指定需要执行的方法的,不一定非得叫main:
main=None,
5 . tf.app.flags只是对argpars的简单封装。代码见
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:18292次
排名:千里之外
原创:164篇
(5)(9)(32)(14)(4)(1)(11)(94)

我要回帖

更多关于 联通wlan免费体验 的文章

 

随机推荐