资讯专栏INFORMATION COLUMN

python实现命令行交互

zhangke3016 / 1769人阅读

摘要:所以就只能使用实现脚本进行交互,和解耦合。使用的库和代码由于命令行执行之后,进程一直在运行,不停的出块,所以我将出块的内容写入到文件中。

背景:
最近因为工作需求在写自动化测试脚本,主要目的是测试代码功能的完整性,然而在使用SSHLibrary库进行远程SSH交互的时候总是出现问题,比如说遇到需要输入密码的交互,总是不能成功,还有遇到一直保持运行并实时输出的命令,也无法读取其中的输出。所以就只能使用python实现脚本进行交互,和SSH解耦合。
使用的库subprocess和argparse;

代码1:由于命令行执行之后,进程一直在运行,不停的出块,所以我将出块的内容写入到文件中。

import subprocess
import sys
import argparse

class TimeoutError(Exception):
    pass 

def excuteCmd(cmd):
        popen = subprocess.Popen(cmd,stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell = True) 

        while True:
            buff = popen.stdout.readline()
            fh = open("/home/ubuntu/bottos/bottos.txt", "a+")
            fh.write(buff)
            sys.stdout.write(buff)
            if buff == "" and popen.poll() != None:
                break
    

if __name__ == "__main__":
        """ self test """ 
        parser = argparse.ArgumentParser(description="manual to this script")
        parser.add_argument("--delegate", type=str,default=None)
        args = parser.parse_args()
        try: 
            bottos = "/home/ubuntu/bottos/bottos "
            cmd = bottos + "--delegate " + args.delegate + " --enable-wallet"
            ret = excuteCmd(cmd)
            print ret 
        except TimeoutError, e: 
            print repr(e)

代码2:实现输入密码的功能

import subprocess
import argparse

class TimeoutError(Exception):
    pass 

def excuteCmd(cmd, passwd, timeout = 1):
        s = subprocess.Popen(cmd,stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell = True) 
        s.stdin.write(passwd+"
")
        out, err = s.communicate()
        if err is not None:
            return err
    
        return out
    

if __name__ == "__main__":
        """ self test """ 
        parser = argparse.ArgumentParser(description="manual to this script")
        parser.add_argument("--name", type=str,default=None)
        parser.add_argument("--passwd", type=str,default=None)
        args = parser.parse_args()
        try: 
            unlock = "/home/ubuntu/bottos/bcli wallet unlock "
            cmd = unlock + "--account " + args.name
            ret = excuteCmd(cmd,args.passwd,5)
            print ret 
        except TimeoutError, e: 
            print repr(e)

临时解救用的脚本,有几个问题

在使用popen.stdout.read()读取不出来内容,只能使用popen.stdout.readline()

在使用stdout.read()stdin.write() communicate()不能同时使用,原因可能是需要用stdout.readline(),不过我没有尝试。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44929.html

相关文章

  • 收藏 | 10个可以快速用Python数据分析的小技巧

    摘要:函数将单元格内容以形式呈现。自动评论代码自动注释单元格中的选定行,再次命中组合将取消注释相同的代码行。如果需要恢复整个已删除的单元格,请按或撤消删除单元格。 showImg(https://segmentfault.com/img/remote/1460000019599210); 编译:小七、蒋宝尚 一些小提示和小技巧可能是非常有用的,特别是在编程领域。有时候使用一点点黑客技术,既可...

    silvertheo 评论0 收藏0
  • Python3网络爬虫实战---5、存储库的安装:PyMySQL、PyMongo、RedisPy、R

    摘要:相关链接官方文档安装推荐使用安装,命令如下运行完毕之后即可完成的安装。上一篇文章网络爬虫实战数据库的安装下一篇文章网络爬虫实战库的安装 上一篇文章:Python3网络爬虫实战---4、数据库的安装:MySQL、MongoDB、Redis下一篇文章:Python3网络爬虫实战---6、Web库的安装:Flask、Tornado 在前面一节我们介绍了几个数据库的安装方式,但这仅仅是用来存...

    AlanKeene 评论0 收藏0
  • python入门,编程基础概念介绍(变量,条件,函数,循环)

    摘要:该系列文章入门,编程基础概念介绍变量,条件,函数,循环中的数据类型,,,,在中创建对象学一门编程语言正在变得越来越容易,只要念过高中甚至是初中小学,能熟练聊和懂得一点点软件的人,入门一门编程语言都不在话下。 该系列文章: 《python入门,编程基础概念介绍(变量,条件,函数,循环)》 《python中的数据类型(list,tuple,dict,set,None)》 《在python...

    Bryan 评论0 收藏0
  • python入门

    摘要:零预备知识字符编码计算机只能处理数字,所以为文本需要转化为数字才能被计算机处理,计算机里八个比特作为一个字节,这是数据的存储基础单位。 零、预备知识 0.1 字符编码计算机只能处理数字,所以为文本需要转化为数字才能被计算机处理,计算机里八个比特(bit)作为一个字节(byte),这是数据的存储基础单位。计算机为了处理文本,有以下三种编码方式: ASCII码:只有大小写英文字母,数字...

    xeblog 评论0 收藏0
  • PHP命令下的世界

    摘要:命令行参数详解查看的所有命令行参数,使用命令。我们将会对大部分常用的命令行参数进行一一解释,以加深对能力的认识,更加快捷的在服务端命令行下使用或者调试各种因为对环境不熟悉而出现的问题。 PHP作为一门web开发语言,通常情况下我们都是在Web Server中运行PHP,使用浏览器访问,因此很少关注其命令行操作以及相关参数的使用,但是,特别是在类Unix操作系统上,PHP可以作为一门脚本...

    calx 评论0 收藏0

发表评论

0条评论

zhangke3016

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<