Subprocess模块

python3.5将使用Subprocess模块跟操作系统进行交互,比如系统命令,他将替换
os.system
os.spawn*
subprocess.run()方法封装的subprocess.Popen()
subprocess.run()方法只在3.5中才有2.7中有一个subprocess.call()方法
>>> subprocess.call(['df','-lh'])
Filesystem     Size   Used  Avail Capacity  iused    ifree %iused  Mounted on
/dev/disk1    465Gi  209Gi  256Gi    45% 54730457 67109157   45%   /
/dev/disk2s1  741Mi  557Mi  184Mi    76%   142675    47036   75%   /Volumes/Parallels Desktop 11
/dev/disk3s2  786Mi  669Mi  117Mi    86%   171353    29853   85%   /Volumes/ParallelsDesktop 11.1.3-32521
0
这里给call方法,传“df -lh”这种多个参数时,用的是传入列表的形式['df','-lh’],python解释器在处理subprocess.call()方法时,将传进来的列表参数经过处理,最终转换成shell中的df -lh,那么如果我就不想传列表,怎么办呢。2.7中也可以实现,如下方法
>>> subprocess.call('df -lh',shell=True)
Filesystem     Size   Used  Avail Capacity  iused    ifree %iused  Mounted on
/dev/disk1    465Gi  209Gi  256Gi    45% 54730303 67109311   45%   /
/dev/disk2s1  741Mi  557Mi  184Mi    76%   142675    47036   75%   /Volumes/Parallels Desktop 11
/dev/disk3s2  786Mi  669Mi  117Mi    86%   171353    29853   85%   /Volumes/ParallelsDesktop 11.1.3-32521

0
这里 subprocess.call('df -lh',shell=True)就明确告诉python解释器,你不用给我转了,就使用shell来进行执行。
很多时候,我门都想通过python里的模块方法获得执行结果。
怎么实现呢。
>>> a = subprocess.call("df -lh",shell=True)
Filesystem     Size   Used  Avail Capacity  iused    ifree %iused  Mounted on
/dev/disk1    465Gi  209Gi  256Gi    45% 54730696 67108918   45%   /
/dev/disk2s1  741Mi  557Mi  184Mi    76%   142675    47036   75%   /Volumes/Parallels Desktop 11
/dev/disk3s2  786Mi  669Mi  117Mi    86%   171353    29853   85%   /Volumes/ParallelsDesktop 11.1.3-32521
>>> a
0

这里我们看到0为执行命令的返回状态。
那么怎么得到结果呢。通过管道。将结果通过管道返回。
>>> a = subprocess.call("df -lh",shell=True,stdout=subprocess.PIPE)
>>> a
0

我们得到依然是0,为毛。因为call方法只返回执行状态。不返回命令执行结果。
如果想存下来,不能用call,要用Popen方法。
>>> a = subprocess.Popen('df -lh',shell=True)
>>> Filesystem     Size   Used  Avail Capacity  iused    ifree %iused  Mounted on
/dev/disk1    465Gi  209Gi  256Gi    45% 54852887 66986727   45%   /
/dev/disk2s1  741Mi  557Mi  184Mi    76%   142675    47036   75%   /Volumes/Parallels Desktop 11
/dev/disk3s2  786Mi  669Mi  117Mi    86%   171353    29853   85%   /Volumes/ParallelsDesktop 11.1.3-32521
>>> a
<subprocess.Popen object at 0x10881cb50>

看到这个和os模块的Popen方法得到的一样。那么我们试下a.read()
发现没有read()方法。在试下a.stdout.read()
同样没有a.stdout.read()方法。
那么分析下python运行Popen方法的执行过程。
Popen()方法执行里面的shell命令,其实是python又开启了一个子进程,子进程运行的结果要想返回给Popen()方法,需要使用管道,写法如下:
>> a = subprocess.Popen('df -lh',shell=True,stdout=subprocess.PIPE)
>>> a.returncode
a.returncode
>>> a.std
a.stderr a.stdin  a.stdout
>>> a.stdout.read()
'Filesystem     Size   Used  Avail Capacity  iused    ifree %iused  Mounted on\n/dev/disk1    465Gi  209Gi  255Gi    46% 54971946 66867668   45%   /\n/dev/disk2s1  741Mi  557Mi  184Mi    76%   142675    47036   75%   /Volumes/Parallels Desktop 11\n/dev/disk3s2  786Mi  669Mi  117Mi    86%   171353    29853   85%   /Volumes/ParallelsDesktop 11.1.3-32521\n’

总结:
使用subprocess模块,想获得命令执行结果。1.使用Popen方法 2.使用管道3.使用a.stdout.read()方法记住下面的例子即可:
a = subprocess.Popen('df -lh',shell=True,stdout=subprocess.PIPE)
subprocess 另外几个方法
subprocess.check_call()检查执行结果,如果返回0说明执行正常,如果不返回0,返回报错
>>> subprocess.call('sssdf',shell=True)
/bin/sh: sssdf: command not found
127
>>> subprocess.check_call('sssdf',shell=True)
/bin/sh: sssdf: command not found
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 540, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command 'sssdf' returned non-zero exit status 127
>>>

subprocess.check_stdout()
subprocess.Popen()的其他参数,记住下面三个即可。其他用的少
stdin,stdout,stderr:分别表示程序的标准输入、输出、错误句柄
举例:
>>> obj = subprocess.Popen(["python"],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>>> obj.stdin.write('print 1 \n')
>>> obj.stdin.write('print 2 \n')
>>> obj.stdin.write('print 3 \n')
>>> obj.stdin.write('print 4 \n’)
执行到这里,我想执行前面的输入内容了,那么就要用communicate() 方法
>>> out_error_list = obj.communicate()                                   
>>> print out_error_list                                                       
('1\n2\n3\n4\n', ‘')

python2.7是这样写,python3.5就不用Popen,想得到命令的执行结果用subporcess.run()方法即可,run方法在2.7中是没有的
>>> b = subprocess.run('df -lh',shell=True,stdout=subprocess.PIPE)
>>> b
CompletedProcess(args='df -lh', returncode=0, stdout=b'Filesystem     Size   Used  Avail Capacity  iused    ifree %iused  Mounted on\n/dev/disk1    465Gi  210Gi  255Gi    46% 54985500 66854114   45%   /\n/dev/disk2s1  741Mi  557Mi  184Mi    76%   142675    47036   75%   /Volumes/Parallels Desktop 11\n/dev/disk3s2  786Mi  669Mi  117Mi    86%   171353    29853   85%   /Volumes/ParallelsDesktop 11.1.3-32521\n')
>>>

python常用内置模块,执行系统命令的模块相关推荐

  1. python常用内置模块-Python常用内置模块之xml模块

    xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.从结构上,很像HTML超文本标记语言.但他们被设计的目的是不同的,超文本标记语言被设计用来显示 ...

  2. python常用内置模块-Python常用内置模块之xml模块(详解)

    xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.从结构上,很像HTML超文本标记语言.但他们被设计的目的是不同的,超文本标记语言被设计用来显示 ...

  3. python常用内置模块-python 常用内置模块使用

    python模块分类:1,标准库2,开源模块3,自定义模块 python 常用内置模块使用 1,time与datetime获取时间戳: time.time() 时间元组: time.localtime ...

  4. python常用内置模块-Python基础-22常用内置模块

    22. 常用内置模块 22.1 random模块 随机数据可以用于数学.测试.安全.算法等领域中.内置random模块,可用于生成伪随机数. 真正意义上的随机数或随机事件是在某次产生过程中是按照实验过 ...

  5. python常用内置模块-Python之OS模块常用内置方法汇总

    OS模块的常用内置方法 chdir修改当前工作目录到指定目录 Change the current working directory to the specified path. chmod修改一个 ...

  6. python常用内置模块-Python内置模块和第三方模块

    Python的强大之处在于他有非常丰富和强大的标准库和第三方库(模块),几乎你想实现的任何功能都有相应的Python库支持,就类似于C#中的类库亦或JAVA的jar包,前端中的JS库. 使用模块有什么 ...

  7. python常用内置模块-Python-常用的内置模块

    常用的内置模块的介绍os,sys,time,datetime,json/pickle,shutil,random 一.os 1.切换目录,查看当前工作的目录os.getcwd 2.当前目录,上级目录o ...

  8. 安装python 的包控制mysql的Python脚本与执行系统命令的Python脚本

    安装python 的包 python 有很多的第三方软件包, 提供了 标准库中没有的功能. python 的官方支持的软件包的网站: PyPI · The Python Package Index 安 ...

  9. python常用内置模块(库)(持续更新)

    python常用简单模块 time与datetime模块 random模块 os模块 sys模块 shutil模块 json&pickle模块 json pickle xml模块 shelve ...

  10. python常用内置模块-python常见内置模块collections

    collections是Python内建的一个集合模块,提供了许多有用的集合类. namedtuple 我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成:>>> ...

最新文章

  1. 云计算DHT分布式存储
  2. iOS 13 Xcode11 中的 Scene Delegate
  3. Powershell 邮件发送
  4. linux下eclipse cdt引用函数库设置问题
  5. DL:关于深度学习常用数据集中训练好的权重文件(Deeplab v3、MobileNet、InceptionV3、VGG系列、ResNet、Mask R-CNN )下载地址集合(持续更新)
  6. 在linux中编写shell脚本文件,如何编写简单的Shell脚本(Script)文件之Linux的基本操作...
  7. 关于http的一点常识
  8. SQL Server 2008 卸载报错
  9. PHP水果店管理系统,赢通水果店管理系统A3专业版
  10. 手机PIN码解锁过程
  11. 计算机无法进去系统,电脑开机后进不了系统的解决方法步骤图
  12. 用计算机怎么算sin1.75,计算器sin30怎么按
  13. minigui 的中文字体部署及支持窗口模态、非模态
  14. js获取用户浏览器信息和ip地址以及位置
  15. 相关性分析和热图绘制
  16. springboot毕设项目酒店管理系统g72sp(java+VUE+Mybatis+Maven+Mysql)
  17. task_struct结构
  18. 修改Discuz! X2标题、底部和Archiver页面的版权信息
  19. 最新《北风网web全栈教程 前端开发全套教程》
  20. 大商创2.2.7短信接口替换

热门文章

  1. Web开发中最致命的8个小错误
  2. [转载]Unity3D 访问Access数据库
  3. windows内核驱动漏洞挖掘工具 - IOCTL Fuzzer
  4. Output Arcade for Mac - 新型音频合成器
  5. 如何使用Vegas Pro制作遮罩转场效果?
  6. 使用iMazing精准地导出Safari浏览器数据
  7. AQS-sync同步队列 [自定义同步器框架]
  8. JavaScript Event Delegation, and event.target vs. event.currentTarget
  9. Elasticsearch模块功能之-索引分片分配(Index shard allocation)
  10. storm 可靠性和非可靠性