python调用shell命令-用Python调用Shell命令

Python经常被称作“胶水语言”,因为它能够轻易地操作其他程序,轻易地包装使用其他语言编写的库,也当然可以用Python调用Shell命令。

用Python调用Shell命令有如下几种方式:

第一种:os.system

os.system("The command you want").

1353331-20191108105451364-666025951.png

1353331-20191108105658026-678503706.png

这个调用相当直接,且是同步进行的,程序需要阻塞并等待返回。返回值是依赖于系统的,直接返回系统的调用返回值,所以windows和linux是不一样的。

第二种:os.popen

os.popen(command[,mode[,bufsize]])

先给大家看个例子

1353331-20191108110117089-466800762.png

可以看出,popen方法通过p.read()获取终端输出,而且popen需要关闭close().当执行成功时,close()不返回任何值,失败时,close()返回系统返回值. 可见它获取返回值的方式和os.system不同。

第三种,使用commands ( python3失效)

根据你需要的不同,commands模块有三个方法可供选择。getstatusoutput, getoutput, getstatus。

commands.getstatusoutput(cmd) 返回(status, output).

commands.getoutput(cmd) 只返回输出结果

commands.getstatus(file) 返回ls-ld file的执行结果字符串,调用了getoutput,不建议使用此方法

1353331-20191108110823190-1728997211.png

但是,如上三个方法都不是Python推荐的方法,而且在Python3中其中两个已经消失。

第四种,subprocess《Python文档中目前全力推荐》

subprocess使用起来同样简单:

直接调用命令,返回值即是系统返回。shell=True表示命令最终在shell中运行。Python文档中出于安全考虑,不建议使用shell=True。建议使用Python库来代替shell命令,或使用pipe的一些功能做一些转义。官方的出发点是好的,不过真心麻烦了很多, so....

但是,我使用subprocess失败了

>>> importsubprocess>>> subprocess.call("cat %s |grep %s > %s" % ("/home/www/running/os-app-api/nohup.out","2019-10-28","~/nohup-2019-10-28.out"))

Traceback (most recent call last):

File"", line 1, in File"/usr/lib64/python3.6/subprocess.py", line 287, incall

with Popen(*popenargs, **kwargs) as p:

File"/usr/lib64/python3.6/subprocess.py", line 729, in __init__restore_signals, start_new_session)

File"/usr/lib64/python3.6/subprocess.py", line 1364, in_execute_childraisechild_exception_type(errno_num, err_msg, err_filename)

FileNotFoundError: [Errno2] No such file or directory: 'cat /home/www/running/os-app-api/nohup.out |grep 2019-10-28 > ~/nohup-2019-10-28.out': 'cat /home/www/running/os-app-api/nohup.out |grep 2019-10-28 > ~/nohup-2019-10-28.out'

1353331-20191108114727473-1528204803.png

但是。。我可以直接运行在shell里面:

1353331-20191029160803777-559086922.png

同样的 我用os.system 去运行,也确实产生了。。好奇

>>> importos>>> os.system("cat %s |grep %s > %s" % ("/home/www/running/os-app-api/nohup.out","2019-10-28","~/nohup-2019-10-28.out"))256

1353331-20191029161144445-973465431.png

源码研究:

1353331-20200326235148024-1803902993.png

这里面最为重要的几个参数是:.

args:要执行的shell命令,或者是命令的列表;

bufsize:缓冲区大小;。

stdin、stdout、stderr:表示程序的标准输入、标准输出以及错误输出。

shell:是否直接执行命令,如果设置为True就表示可以直接执行;

cwd:当前的工作目录;

env:子进程环境变量;

案例:

1353331-20200327000211695-1384131182.png

subprocess模块里面还有一项功能比较强大的支持在于可以直接使用标准输入、标准输出和错误输出进行进程的数据通讯操作。

例如,在Python安装完成之后都会存在有交互式的编程环境,那么本次将通过程序调用交互式编程环境。

直接操作python命令行,在python命令行中直接输入程序。

defmain():

subp_popen=subprocess.Popen("python.exe",stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)

subp_popen.stdin.write("print('subp_popen.stdin.write1') ".encode())

subp_popen.stdin.write("print('subp_popen.stdin.write2') ".encode())

subp_popen.stdin.write(("print('subp_popen.stdin.write3'+1)").encode())

subp_popen.stdin.close()

cmd_out=subp_popen.stdout.read()

subp_popen.stdout.close()print(cmd_out.decode())

cmd_err=subp_popen.stderr.read()

subp_popen.stderr.close()print(cmd_err)if __name__ == '__main__':

main()

结果:

1353331-20200327002704959-492237585.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值