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

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

第一种:os.system

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

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

第二种:os.popen

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

先给大家看个例子

可以看出,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,不建议使用此方法

但是,如上三个方法都不是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'

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

同样的 我用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

源码研究:

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

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

bufsize:缓冲区大小;。

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

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

cwd:当前的工作目录;

env:子进程环境变量;

案例:

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()

结果:

python调用shell命令-用Python调用Shell命令相关推荐

  1. Python语言学习:利用python语言实现调用内部命令(python调用Shell脚本)—命令提示符cmd的几种方法

    Python语言学习:利用python语言实现调用内部命令(python调用Shell脚本)-命令提示符cmd的几种方法 目录 利用python语言实现调用内部命令-命令提示符cmd的几种方法 T1. ...

  2. shell调用python函数 参数 返回_Python之系统shell交互(subprocess)

    subprocess是Python 2.4中新增的一个模块,它允许你生成新的进程,连接到它们的 input/output/error 管道,并获取它们的返回(状态)码.这个模块的目的在于替换几个旧的模 ...

  3. shell调用python获取返回值_[linux的shell脚本调用python脚本的返回值][shell调python][ubuntu的shell调用python脚本得到返回值]...

    最近搞个东西,需要写shell脚本,但在shell脚本里需要调用python并得到变量值,网上找了很多都是python调shell的,最后请教了一下郭总 知道了sys.argv的用法后才搞定了,在此感 ...

  4. python调用php命令行,python调用php函数 python怎样调用php文件中的函数详解

    前言 python调用php代码实现思路:php文件可通过在terminal中使用php命令行进行调用,因此可使用python开启子进程执行命令行代码.函数所需的参数可通过命令行传递. 测试环境 1. ...

  5. python commands执行不连续_[Python] 利用commands模块执行Linux shell命令

    用Python写运维脚本时,经常需要执行linux shell的命令,Python中的commands模块专门用于调用Linux shell命令,并返回状态和结果,下面是commands模块的3个主要 ...

  6. python解压7z文件_Python调用7zip命令实现文件批量解压

    Python调用7zip命令实现文件批量解压 1.输入压缩文件所在的路径 2.可以在代码中修改解压到的文件路径和所需要解压的类型,列入,解压文件夹下面所有的mp4格式的文件 3.cmd 指的就是Pyt ...

  7. linux命令封装sh,shell脚本学习之调用脚本将文件打包zip的方法示例

    前言 本文主要给大家介绍的是关于调用脚本将文件打包zip的相关资料,分享出来供大家参考学习,下面来一起看看详细的介绍: 最近刚刚接触shell脚本,写了一点简单的练手.这里是用python调用脚本执行 ...

  8. Vim命令行模式调用shell命令方式(笔记)

    本文为阅读vim实用技巧时的一部分笔记 在vim中操作时,我们能很方便德调用shell命令.下面选取了最有用的一些调用外部命令的方式: :shell:启动一个shell(输入exit返回vim) :! ...

  9. perl脚本执行linux命令行,Perl调用shell命令方法小结

    一.system perl也可以用system调用shell的命令,它和awk的system一样,返回值也是它调用的命令的退出状态. 代码如下: [root@AX3sp2 ~]# cat aa.pl ...

  10. linux常用命令及其python调用

    文件及文件夹夹操作 以下path指路径名称,filename指文件名,-args指可用多种参数 文件夹操作 linux命令 作用 python调用 pwd 展示当前路径 cd path 切换文件夹 l ...

最新文章

  1. 人工智能 MIT 博士系列讲课
  2. 解决Springboot+JPA中多表关联查询会查询多次的问题(n+1查询问题)
  3. python类介绍说明_python 中类
  4. IDEA常用设置【很实用】
  5. solr基本查询和高级查询
  6. 18.linux日志收集数据到hdfs上面
  7. netty应用场景_彻底搞懂 netty 线程模型
  8. C++ 数组与指针详解之终极无惑
  9. python编程语言-为什么我不建议你将python作为入门编程语言
  10. 最大数组全局还是局部的问题
  11. VB编程必备!_VB源码之友(内含-下载-破解-使用方法)
  12. linux的文件系统是采用,Linux文件系统
  13. 缺少对公共可见类型或成员的XML注释
  14. ARM 汇编指令 MRS用法
  15. 《老路用得上的商学课》1-15学习笔记
  16. (2022.5.27)【Win10】Windows10重置后微软商店闪退打不开、图片闪退打不开、UWP应用闪退打不开——可能的解决方案
  17. int temp java,temp是什么意思
  18. 推荐几款软件界面模型设计工具
  19. php 均匀随机算法,PHP算法学习(4) 随机算法
  20. 4. hda设备中的pcm文件(第二部分)

热门文章

  1. 给vim添加自动跳出括号的功能
  2. malloc和new出来的地址都是虚拟地址 你就说内存管理单元怎么可能让你直接操作硬件内存地址!...
  3. MongoDB 3.0 WiredTiger Compression and Performance
  4. centos7 docker 安装 otter 注意事项
  5. 花神游历各国 题解(小清新线段树/树状数组+并查集)
  6. 【9.22校内测试】【可持久化并查集(主席树实现)】【DP】【点双联通分量/割点】...
  7. 学习笔记整理之对象的转型
  8. SQL盲注之时间注入
  9. Git环境搭建与基本使用方法
  10. SQL语言 之 数据查询