python代入命令_Python 调用外部命令

python 可以使用 os 模块来调用外部的 Linux Shell 命令,常用的方法如下:

os.system():结果输出在终端上,捕获不到

os.popen() : 结果返回一个对象,即标准输出

os.popen2():结果返回两个对象,分别是标准输入,标准输出

os.popen3():结果返回三个对象,分别是标准输入,标准输出,标准错误输出

os.popen4():结果返回两个对象,分别是标准输入,标准输出(标准输出中包括标准错误输出)

In [2]: stdout = os.system('ls /data') # os.system() --- 结果输出在终端上,会返回执行命令的状态码,我们可以用变量来接收1.txt 2.txt 3.txt

In [3]: print(stdout)

0

In [7]: stdout = os.popen('ls /data') # os.popen() --- 结果返回一个对象,即标准输出,标准输出需要用read()、readlines()等方法读取

In [8]: printstdout.read()1.txt2.txt3.txt

In [24]: stdin, stdout = os.popen2('cat') # os.popen2() --- 结果返回两个对象,分别是标准输入,标准输出

In [25]: stdin.write('hello\n') # 我们使用 write() 来进行输入,使用 close() 来结束输入,使用 read() 来读取输出

In [26]: stdin.write('world\n')

In [27]: stdin.close()

In [28]: printstdout.read()

hello

world

使用 os 模块来调用 shell 命令已经过时了,官方建议我们使用 subprocess 模块,subprocess 会开启一个子进程(即shell)来执行命令:

subprocess.call() :用于执行 shell 命令,但结果不能被捕获到,只会输出到终端,如 subprocess.call('ls -l /data', shell=True)

subprocess.check_call() :用法与 call() 一致,不同的是,如果命令执行失败,会抛出 CalledProcessError 异常,我们可以根据这个异常去决定需要做什么

subprocess.Popen() :用于执行 shell 命令,结果返回三个对象,分别是标准输入,标准输出,标准错误输出

In [1]: from subprocess importPopen, PIPE

In [2]: p = Popen('ls /data', stdin=PIPE, stdout=PIPE, stderr=PIPE, shell=True) #stdin用于接收标准输入,可选参数,可以通过 p.stdin.write('xxx') 添加标准输入

#stdout用于接收标准输出,可选参数,可以通过 p.stdout.read() 读取标准输出

In [3]: p.stdout.read() #stderr用于接收标准错误输出,可选参数,可以通过 p.stderr.read() 读取标准错误输出

Out[3]: '1.txt\n2.txt\n3.txt\n' #shell=True用于表明该命令是在shell下执行的,如果不加上该参数会报错

#如果我们没有用PIPE来接收标准输出和标准错误输出,则默认会打印到终端上

In [4]: p.stderr.read() #另外要注意的是,当我们写成 p = Popen(...) 时,命令就已经执行了,执行后的结果放在管道(PIPE)里面

Out[4]: '' # subprocess.Popen()其他常用方法

线上的用法:

importsubprocessdefrunCMD(self, ip, cmd, logfile):

out= ""sshcmd= '''ssh root@%s -n '%s'''' %(ip, cmd)

p= subprocess.Popen(sshcmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)whileTrue:

buff=p.stdout.readline()if p.poll() != None and buff == "":break

ifbuff:

out+=buff

self.writeLogFile(logfile, buff)return p.returncode, out

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值