subprocess模块中定义了一个Popen类,通过它可以来创建进程,并与其进行复杂的交互。查看一下它的构造函数:

__init__(self, args, bufsize=0, executable=None,
stdin=None, stdout=None, stderr=None, preexec_fn=None,
close_fds=False, shell=False, cwd=None, env=None,
universal_newlines=False, startupinfo=None,
creationflags=0)

主要参数说明:

args:args should be a string, or a sequence of program arguments.也就是说必须是一个字符串或者序列类型(如:字符串、list、元组),用于指定进程的可执行文件及其参数。如果是一个序列类型参数,则序列的第一个元素通常都必须是一个可执行文件的路径。当然也可以使用executeable参数来指定可执行文件的路径。

stdin,stdout,stderr:分别表示程序的标准输入、标准输出、标准错误。有效的值可以是PIPE,存在的文件描述符,存在的文件对象或None,如果为None需从父进程继承过来,stdout可以是PIPE,表示对子进程创建一个管道,stderr可以是STDOUT,表示标准错误数据应该从应用程序中捕获并作为标准输出流stdout的文件句柄。

shell:如果这个参数被设置为True,程序将通过shell来执行。

env:它描述的是子进程的环境变量。如果为None,子进程的环境变量将从父进程继承而来。

创建Popen类的实例对象

res = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

cmd:标准像子进程传入需要执行的shell命令,如:ls -al

subprocess.PIPE:在创建Popen对象时,subprocess.PIPE可以初始化为stdin, stdout或stderr的参数,表示与子进程通信的标准输入流,标准输出流以及标准错误。

subprocess.STDOUT:作为Popen对象的stderr的参数,表示将标准错误通过标准输出流输出。

Popen类拥有的方法及属性

1、Popen.pid 

获取子进程的进程ID。

2、Popen.returncode 

获取进程的返回码。如果进程未结束,将返回None。

3、communicate(input=None) 

官方解释:

Interact with process: Send data to stdin. Read data from
stdout and stderr, until end-of-file is reached. Wait for
process to terminate. The optional input argument should be a
string to be sent to the child process, or None, if no data
should be sent to the child.

communicate() returns a tuple (stdout, stderr).

与子进程进行交互,像stdin发送数据,并从stdout和stderr读出数据存在一个tuple中并返回。 
参数input应该是一个发送给子进程的字符串,如果未指定数据,将传入None。

4、poll() 

检查子进程是否结束,并返回returncode属性。

5、wait()

Wait for child process to terminate. Returns returncode attribute.

等待子进程执行结束,并返回returncode属性,如果为0表示执行成功。

6、send_signal( sig)

Send a signal to the process

发送信号给子进程。

7、terminate()

Terminates the process

终止子进程。windows下将调用Windows API TerminateProcess()来结束子进程。

8、kill() 

官方文档对这个函数的解释跟terminate()是一样的,表示杀死子进程。

进程通信实例1

打开一个只有ip地址的文本文件,读取其中的ip,然后进行ping操作,并将ping结果写入ping.txt文件中。 
首先创建一个子进程res,传入要执行的shell命令,并获得标准输出流、返回码等。

import subprocess
import os
class Shell(object) :def runCmd(self, cmd) :res = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)sout ,serr = res.communicate() return res.returncode, sout, serr, res.pidshell = Shell()
fp = open('c:\\test\\ip.txt', 'r')
ipList = fp.readlines()
fp.close()
fp = open('c:\\test\\ping.txt', 'a')
print ipList
for i in ipList :i = i.strip()result = shell.runCmd('ping ' + i)if result[0] == 0 :w = i + ' : 0'fp.write(w + '\n')else :w = i + ' : 1'fp.write(w + '\n')fp.close()

执行结果:

进程通信实例2

命令交互,不断从键盘接受命令执行,给出执行结果,直到用户输入exit或者bye退出命令交互。

import subprocess
class Shell(object) :def runCmd(self, cmd) :res = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)sout ,serr = res.communicate()   return res.returncode, sout, serr, res.pidshell = Shell()
while 1 :input = raw_input('>')if input == 'exit' or input == 'bye' :breakelse :result = shell.runCmd(input)print "返回码:", result[0]print "标准输出:", result[1]print "标准错误:", result[2]

在Windows上也可以使用os.system()这个函数来执行一些dos命令,但是这个命令只能拿到返回码,拿不到标准输出,标准错误,所以通常使用的subprocess模块中的Popen类来实现。

  • subprocess.call()

执行命令,并返回执行状态。其中shell参数为False时,命令需要通过列表的方式传入,当shell为True时,可直接传入命令。示例如下:

>>> a = subprocess.call(['df','-hT'],shell=False)
>>> a  = subprocess.call('df -hT',shell=True)
>>> print a
0
  • subprocess.check_call()

用法与subprocess.call()类似,区别是,当返回值不为0时,直接抛出异常,示例如下:

>>> a = subprocess.check_call('df -hT',shell=True)
>>> print a
0
>>> a = subprocess.check_call('dfdsf',shell=True)
/bin/sh: dfdsf: command not found
Traceback (most recent call last):File "<stdin>", line 1, in <module>File "/usr/lib64/python2.6/subprocess.py", line 502, in check_callraise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command 'dfdsf' returned non-zero exit status 127

python subprocess模块 命令执行相关推荐

  1. python常见模块命令(os/sys/platform)

    python常见模块命令(os/sys/platform) 一.Os Python的标准库中的os模块主要涉及普遍的操作系统功能.可以在Linux和Windows下运行,与平台无关. os.sep 可 ...

  2. 查看python内部模块命令,内置函数,查看python已经安装的模块命令

    查看python内部模块命令,内置函数,查看python已经安装的模块命令 可以用dir(modules) 或者用 pip list 或者用 help('modules') 或者用 python -m ...

  3. Python subprocess模块

    subprocess subprocess模块介绍 subprocess模块是一个可以将系统内的命令结果赋值给变量并打印, 还可以输出命令执行状态,subprocess可以单独将 命令输出结果与执行状 ...

  4. python subprocess 模块

    subprocess 模块中有一个功能Popen , 可以在代码中调用系统的命令 其功能比os.system 更加强大 代码示例: command = 'python -u %s/generalMak ...

  5. python supervisord 远程命令执行漏洞(CVE-2017-11610)

    Supervisord Supervisord是一款Python开发,用于管理后台应用(服务)的工具,其角色类似于Linux自带的Systemd. 我觉得它相比Systemd有几个特点: 配置比较简单 ...

  6. python subprocess模块_python subprocess模块详解

    一.subprocess标准库 python执行shell脚本,通常会使用so模块中的几个方法,如system.spawn*.popen等.subprocess标准库的引入就是为了取代这些老的模块方法 ...

  7. go(flag+cobra)——python(argpase模块)——命令行参数

    目录 python sys.argv argparse模块 ArgumentParse类 add_argument()常用参数 Q&A 终端打印中文帮助信息出现乱码 Go os.Args fl ...

  8. python导入模块不执行_python 不执行

    [人间也值得] - Mryang带你快速入门第一个 Python 程序 版权声明:本文为博主原创文章,未经博主允许不得转载.https://blog.csdn.net/kese7952/article ...

  9. Anaconda中python安装模块命令

    方法一:         在Anaconda Prompt里运行conda install 模块名     方法二:         下载模块的whl安装包,然后在Anaconda Prompt里运行 ...

最新文章

  1. 无人驾驶中用到的八大坐标系
  2. mysql不具有的特征是_MySQL中的SQL特征(转)
  3. JavaScript八张思维导图
  4. 将 Mac OS X 上的目录挂载到 Linux 的方法
  5. windows史上最方便解压rar文件的软件WeDo
  6. 问题 | golang开发之go.mod的使用方法
  7. (Deep learning)深度卷积网络实战——第四部分
  8. OpenCV学习笔记——多种Smooth平滑处理
  9. python正式发布的时间_微软Visual Studio Code 1.44正式发布:加入新Python教程、时间轴视图...
  10. MongoDB应用上的坑
  11. 惠普计算机图标不在桌面,我的电脑图标没了怎么办
  12. 工作中常用的25个Excel操作技巧,附详细步骤,收藏备用
  13. 根据经纬度来计算旋转矩阵
  14. 基于labview的打地鼠游戏制作
  15. js删除对象空属性值的方法
  16. pbe近似_量子化学中的主要近似.doc
  17. NTFS Change Journal(USN Journal)详解
  18. [zz]从软件工程师到IT猎头:我的一点经历和感触zt
  19. matlab的udt,西门子PLC的UDT是干什么的?如何使用?终于讲清楚了
  20. 吹爆 阿里新产Spring Boot高级笔记,肝完变秃也变强

热门文章

  1. Python基本语法_函数_返回值
  2. 电容二极管升压电路分析
  3. BZOJ4668: 冷战 [并查集 按秩合并]
  4. gcc创建静态库和共享库
  5. CentOS学习笔记 - 4. 修改端口和禁止root登录
  6. CSS中的路径裁剪样式clip-path
  7. 单点登录 - 修改CAS服务器的一些配置( 陆续添加)
  8. C#开发学习——内联表达式
  9. java on RHEL5
  10. IE遭破坏后的自我修复方法