注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭州 QA Team

务实 专注 分享 做有态度的QA

 
 
 
 
 

日志

 
 

在python中调用shell的实现方法以及注意事项  

来自张世龙   2015-12-22 15:40:42|  分类: 性能测试 |举报 |字号 订阅

  下载LOFTER 我的照片书  |
在使用grinder开展性能测试过程中,grinder通常通过调用python脚本来实现对服务或API的并发压测。有时候我们需要在脚本中执行一些shell命令来获取环境中的一些资源,下面将介绍一些python调用shell的实现方法,以及一些使用过程中的注意事项。

       方法一:使用os模块system方法

       假如测试过程中我们需要执行一下ls命令,python代码如下

>>> import os
>>> os.system('ls')
ceph_test genSomeXshFiles.sh get_some_ip.sh hosts.txt mem.info
0
>>>

      说明:os.system( )方法可以实现shell命令的执行,但是该方法的返回值是shell命令执行成功还是失败。shell命令执行成功该方法返回0,执行失败返回-1。而命令的执行结果会输出到屏幕,只是我们不能用变量赋值的方法获取shell命令的执行结果。

      该方法除了可以执行shell命令还可以执行我们自己写的shell脚本。假如我们有一个test脚本,脚本内容如下:

#!/bin/bash
echo 'this is a test !'

      当我们使用os.system( )执行该方法的时候需要指定shell脚本的相对当前python文件的路径,假设shell脚本位于test目录下,我们调用该脚本的方法如下:

>>> import os
>>> os.system('./test/test.sh')
this is a test !
0
>>>

      同样的,该方法会将脚本的执行结果输出到标准输出,显示在屏幕上。

       方法二:使用os模块popen方法
       有时候我们在python中执行一个shell命令或shell脚本时需要获取shell命令或脚本的返回值,我们可以利用popen方法实现。popen方法可以将多个子进程的输入输出连接起来形成管道,来实现数据的传输。我们通过popen的read方法就可以获取管道的输出信息,从而实现变量的赋值。
      假设当前我可以通过shell命令获取用户的token,如下所示

hzzhangshilong@10-180-0-47:~$ source ~/userRC;nova credentials|grep id|head -2|tail -1|awk '{print $4}'
6fa718ad23684a64a6ae887f5c5ad90d

hzzhangshilong@10-180-0-47:~$

      在python中可以通过如下方法实现用户token获取,

>>> import os
>>> token = os.popen("source ~/userRC;nova credentials|grep id|head -2|tail -1|awk '{print $4}'").read().strip()
>>> print token
085b1120276b457097c534a5f64c5a27
>>>


      方法三:使用commands模块getoutput方法
      该方法的使用类似于popen方法,代码如下:

>>> import commands
>>> commands.getoutput("source ~/userRC;nova credentials|grep id|head -2|tail -1|awk '{print $4}'")
'3c93d43f5c3c4e88aef03a4b3c81bac6'
>>>

      同样,使用该方法可以将shell命令的执行结果赋给变量,

>>> import commands
>>> var=commands.getoutput("source ~/userRC;nova credentials|grep id|head -2|tail -1|awk '{print $4}'")
>>> print var
656f296461fa4b87a89316d7ceeddda7
>>>

      commands模块还提供了一些其他方法,如getstatusoutput( )方法除了可以获取shell命令的执行结果以外还可以获取shell命令执行成功与否。

>>> import commands
>>> var=commands.getstatusoutput("source ~/userRC;nova credentials|grep id|head -2|tail -1|awk '{print $4}'")
>>> print var
(0, '4f4c6b3790c04e379f1329250b0b295a')
>>>


      有时候python与shell之间除了简单的调用以外还涉及参数的传递,上面的介绍中我们可以获取shell执行的结果,同样我们也可以将python的参数传递给shell。python到shell的参数传递有很多种,
      使用环境变量传递
      通过os模块可以实现利用环境变量进行参数传递,相关代码如下,

>>> import os
>>> var='test'
>>> os.environ['var_shell']=var
>>> os.system('echo $var_shell')
test
0
>>>

      需要注意的是,通过环境变量进行参数传递只能传递字符型变量。
      另外,利用环境变量进行参数传递存在一个很大的问题。对于单线程的任务而言这个问题不存在,但是当涉及多线程时,需要慎用。由于环境变量是整个工作环境共享,在某一时刻环境变量的值是一个值,如果在不同的线程中改变同一个环境变量的值的话,该环境变量保持最后一次被赋值的结果。
      例如,使用grinder对服务进行并发压测时,在方法调用时如果涉及到利用环境变量进行python与shell间的变量传递时,一定要特别留意这一点。
      使用字符串拼接方式
      通过os模块的system( )方法可以实现shell的调用。shell脚本是安装字符串传递给system()方法的。同样,我们也可以利用字符串拼接的方式实现python到shell参数的传递,代码如下,

>>> import os
>>> var=100
>>> os.system('echo ' + str(var))
100
0

     类似的,popen方法也支持利用字符串拼接的方式进行参数传递。
  评论这张
 
阅读(903)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016