Subprocess模块介绍

Subprocess模块 

subprocess.run(args*stdin=Noneinput=Nonestdout=Nonestderr=Noneshell=Falsetimeout=Nonecheck=False)

>>>res2 = subprocess.run(["ls", "-l"])      # 输出结果,返回执行状态,(接收命令为列表)

>>> res2

CompletedProcess(args=['ls', '-l'], returncode=0)

 # 返回结果与执行状态,(接收命令为列表)

# 屏幕输出结果,返回状态,加|时要加shell=True,表示在shell环境下执行
subprocess.run(["df", "-h","|", "grep", "hhe"], shell=True)

#执行命令,如果命令结果为0,就正常返回,否则抛异常(接收命令为列表)>>> subprocess.check_call(["ls", "-l"])

0

#接收字符串格式命令,返回元组形式,第1个元素是执行状态,第2个是命令结果 

 #接收字符串格式命令,并返回结果

 #执行命令,并返回结果,注意是返回结果

 a = subprocess.call(["ls","-l"]) # 命令过程中如果出错,a会返回报错(结果输出屏幕)

>>> res1 = subprocess.call(["ls", "-l"])     # 输出结果,返回执行状态

>>> res1
0

#上面那些方法,底层都是封装的subprocess.Popen 

>>> p = subprocess.Popen("df -h | grep dev", stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True)
>>> p
<subprocess.Popen object at 0x7f3084fcb5c0>
>>> p.stdout.read()
b'/dev/xvda1 40G 7.9G 30G 22% /\ndevtmpfs 910M 0 910M 0% /dev\ntmpfs 920M 0 920M 0% /dev/shm\n'

 

# poll()执行完成才返回状态码,否则返回空

>>> p = subprocess.Popen("sleep 10; echo hello world",shell=True)
>>>
>>> p.poll()
>>> hello world

>>> p.poll()
0

 

terminate() 杀掉所启动进程

poll() :  Check if child process has terminated. Returns returncode

>>> p = subprocess.Popen("sleep 10; echo hello world",shell=True)
>>> p.terminate()
>>> p.poll()
-15

 

#communicate() 等待任务结束Popen.communicate(input=None)
与子进程进行交互。向stdin发送数据,或从stdout和stderr中读取数据。可选参数input指定发送到子进程的参数。 Communicate()返回一个元组:(stdoutdata, stderrdata)。注意:如果希望通过进程的stdin向其发送数据,在创建Popen对象的时候,参数stdin必须被设置为PIPE。同样,如 果希望从stdout和stderr获取数据,必须将stdout和stderr设置为PIPE。

>>> p = subprocess.Popen("sleep 10; echo hello world", stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True)
>>>
>>> p.communicate()


(b'hello world\n', b'')
>>> >>> >>>

Popen.pid 
获取子进程的进程ID。

Popen.stdin 
如果在创建Popen对象是,参数stdin被设置为PIPE,Popen.stdin将返回一个文件对象用于策子进程发送指令。否则返回None。

Popen.stdout 
如果在创建Popen对象是,参数stdout被设置为PIPE,Popen.stdout将返回一个文件对象用于策子进程发送指令。否则返回 None。

Popen.stderr 
如果在创建Popen对象是,参数stdout被设置为PIPE,Popen.stdout将返回一个文件对象用于策子进程发送指令。否则返回 None。

Popen.returncode 
获取进程的返回值。如果进程还没有结束,返回None。

 

下面是一个非常简单的例子,来演示supprocess模块如何与一个控件台应用程序进行交 互。

import subprocess   

p = subprocess.Popen(“app2.exe”, stdin = subprocess.PIPE, /   
stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = False)   

p.stdin.write(’3/n’)   
p.stdin.write(’4/n’)   
print p.stdout.read()   

#—- 结果 —-   
input x:    
input y:    
3 + 4 = 7 

app2.exe也是一个非常简单的控制台程序,它从界面上接收两个数值,执行加操作,并将结 果打印到控制台上。代码如下:

#include <iostream>   
using namespace std;   

int main(int argc, const char *artv[])   
{   
int x, y;   
cout << “input x: ” << endl;   
cin >> x;   
cout << “input y: ” << endl;   
cin >> y;   
cout << x << ” + ” << y << ” = ” << x + y << endl;   

return 0;   

 

posted @ 2017-12-22 12:03  ︻◣_蝸犇り~  阅读(230)  评论(0编辑  收藏  举报