Python--subprocess模块
来源:互联网 发布:php网页爬虫源码 编辑:程序博客网 时间:2024/05/19 20:20
参考博客:http://blog.csdn.net/songfreeman/article/details/50735045
subprocess模块提供了一种一致的方法来创建和处理附加进程,与标准库中的其它模块相比,提供了一个更高级的接口。用于替换如下模块:
os.system() , os.spawnv() , os和popen2模块中的popen()函数,以及 commands().
一、直接处理管道
- subprocess.Popen()方法
函数call(), check_call() 和 check_output() 都是Popen类的包装器。直接使用Popen会对如何运行命令以及如何处理其输入输出有更多控制。如通过为stdin, stdout和stderr传递不同的参数。
1、与进程的单向通信
通过Popen()方法调用命令后执行的结果,可以设置stdout值为PIPE,再调用communicate()获取结果
返回结果为tuple. 在python3中结果为byte类型,要得到str类型需要decode转换一下
# 直接执行命令输出到屏幕>>> subprocess.Popen("ls -l",shell=True)<subprocess.Popen object at 0x7febd4175198>>>> total 12drwxrwxr-x 4 ws ws 4096 Nov 25 13:50 MonitorSystem-rw-rw-r-- 1 ws ws 8 Feb 25 10:38 testdrwxrwxr-x 2 ws ws 4096 Feb 19 10:09 tmp# 不输出到屏幕,输出到变量>>> proc = subprocess.Popen(['echo','"Stdout"'],stdout=subprocess.PIPE)# communicate返回标准输出或标准出错信息>>> stdout_value = proc.communicate()>>> stdout_value(b'"Stdout"\n', None)>>> proc = subprocess.Popen(['ls','-l'],stdout=subprocess.PIPE)>>> stdout_value = proc.communicate()>>> stdout_value(b'total 8\ndrwxrwxr-x 4 ws ws 4096 Nov 25 13:50 MonitorSystem\ndrwxrwxr-x 2 ws ws 4096 Feb 19 10:09 tmp\n', None)>>>>>> print((stdout_value[0]).decode('utf-8'))total 8drwxrwxr-x 4 ws ws 4096 Nov 25 13:50 MonitorSystemdrwxrwxr-x 2 ws ws 4096 Feb 19 10:09 tmp#将结果输出到文件>>> file_handle = open("/home/ws/t.log",'w+')>>> subprocess.Popen("ls -l",shell=True,stdout=file_handle)t.log:drwxrwxr-x 4 ws ws 4096 Nov 25 13:50 MonitorSystem-rw-rw-r-- 1 ws ws 8 Feb 25 10:38 test-rw-rw-r-- 1 ws ws 0 Feb 25 11:24 t.logdrwxrwxr-x 2 ws ws 4096 Feb 19 10:09 tmp
2、与进程的双向通信
>>> proc = subprocess.Popen('cat', shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE)>>> msg = 'Hello world'.encode('utf-8')# 写入到输入管道>>> proc.stdin.write(msg)11>>> stdout_value = proc.communicate()>>> stdout_value(b'Hello world', None)# 在需要进行相互交互的输入输出过程也可以使用shtin来实现# 以下实现打开python3的终端,执行一个print命令>>>proc = subprocess.Popen(['python3'],stdin=subprocess.PIPE,stdout=subprocess.PIPE, stderr=subprocess.PIPE,)>>>proc.stdin.write('print("helloworld")'.encode('utf-8'))>>>out_value,err_value=proc.communicate()>>>print(out_value)>>> print(out_value)b'helloworld\n'>>> print(err_value)b''
Popen.communicate()方法用于和子进程交互:发送数据到stdin,并从stdout和stderr读数据,直到收到EOF。等待子进程结束。
与进程双向通信例子一:
test_input.py
#encoding: utf-8data = raw_input('Please input your cmd:') #从命令行获取命令print 'you input data:'+str(data) #在命令行上打印出来
python命令行一:
>>> f = subprocess.Popen('python /home/python/test_input.py',shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE)>>> f.stdin.write('Hello Python')>>> out = f.communicate()>>> print out('Please input your cmd:you input data:Hello Python\n', None)
python命令行二:
>>> f = subprocess.Popen('python /home/python/test_input.py',shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE)>>> out = f.communicate('Hello Python')>>> print out('Please input your cmd:you input data:Hello Python\n', None)
python命令行三:
>>> f = subprocess.Popen('python /home/python/test_.py',shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE)>>> out,err = f.communicate('Hello Python')>>> print outPlease input your cmd:you input data:Hello Python>>> print errNone
communicate()是Popen对象的一个方法,该方法会阻塞父进程,直到子进程完成。
与进程双向通信例子二:
test_input.py
#encoding: utf-8data = raw_input('Please input your cmd:')print 'you input data:'+str(data)data2 = 'None'try: data2 = raw_input('Please input your cmd again:')except EOFError: print 'EOF'print 'second input data:'+str(data2)
1、直接启动
[root@liefyuan python]# python test_input.py Please input your cmd:Hello Pythonyou input data:Hello PythonPlease input your cmd again:Hello Pythonsecond input data:Hello Python
2、使用Python命令行启动
>>> f = subprocess.Popen('python /home/python/test_input.py',shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE)>>> out,err = f.communicate('Hello Python')>>> print outPlease input your cmd:you input data:Hello PythonPlease input your cmd again:EOFsecond input data:None
从上面看出,subprocess的Popen模块只能是进行一次双向通。第二次通信时就会发生EOF错误,即读文本结束错误。或者说,根本就没有第二次通信。
- Python模块subprocess小记
- Python模块subprocess小记
- python得subprocess模块
- Python模块subprocess小记
- python模块subprocess学习
- python模块subprocess学习
- python模块subprocess学习
- Python的subprocess模块
- Python模块subprocess小记
- python subprocess 模块使用方法
- python之subprocess模块
- python:subprocess模块
- Python subprocess模块
- python 的 subprocess模块
- Python模块subprocess小记
- python学习-subprocess模块
- Python subprocess模块使用
- Python subprocess模块解析
- 启动AVD 时提示 ERROR: GPU emulation is disabled
- 51nod 1873 初中的算术
- 【1003】相连的1
- jquery日期控件jedate的学习
- 讲课大师 指令群介绍
- Python--subprocess模块
- git 远程管理
- ORACLE 求和直接用加法即可
- linux系统操作的基本命令
- df.apply
- Binder学习之——Android的MediaPlayer架构介绍
- 基于 Quartz 开发企业级任务调度应用
- C# 实时监控数据库SqlDependency
- 【脚本语言系列】关于Python结构化文本文件处理Avro,你需要知道的事