举例讲解Python程序与系统shell交互的方式


Posted in Python onApril 09, 2015

概述

考虑这样一个问题,有hello.py脚本,输出”hello, world!”;有TestInput.py脚本,等待用户输入,然后打印用户输入的数据。那么,怎么样把hello.py输出内容发送给TestInput.py,最后TestInput.py打印接收到的”hello, world!”。下面我来逐步讲解一下shell的交互方式。

hello.py代码如下:

#!/usr/bin/python
print "hello, world!"

TestInput.py代码如下:

#!/usr/bin/python
str = raw_input()
print("input string is: %s" % str)

1.os.system(cmd)

这种方式只是执行shell命令,返回一个返回码(0表示执行成功,否则表示失败)

retcode = os.system("python hello.py")
print("retcode is: %s" % retcode);

输出:

hello, world!
retcode is: 0

2.os.popen(cmd)

执行命令并返回该执行命令程序的输入流或输出流.该命令只能操作单向流,与shell命令单向交互,不能双向交互.
返回程序输出流,用fouput变量连接到输出流

fouput = os.popen("python hello.py")
result = fouput.readlines()
print("result is: %s" % result);

输出:

result is: ['hello, world!\n']

返回输入流,用finput变量连接到输出流

finput = os.popen("python TestInput.py", "w")
finput.write("how are you\n")

输出:

input string is: how are you

3.利用subprocess模块

subprocess.call()

类似os.system(),注意这里的”shell=True”表示用shell执行命令,而不是用默认的os.execvp()执行.

f = call("python hello.py", shell=True)
print f

输出:

hello, world!
0

subprocess.Popen()

利用Popen可以是实现双向流的通信,可以将一个程序的输出流发送到另外一个程序的输入流.
Popen()是Popen类的构造函数,communicate()返回元组(stdoutdata, stderrdata).

p1 = Popen("python hello.py", stdin = None, stdout = PIPE, shell=True)
p2 = Popen("python TestInput.py", stdin = p1.stdout, stdout = PIPE, shell=True)
print p2.communicate()[0]
#other way
#print p2.stdout.readlines()

输出:

input string is: hello, world!

整合代码如下:

#!/usr/bin/python
import os
from subprocess import Popen, PIPE, call

retcode = os.system("python hello.py")
print("retcode is: %s" % retcode);

fouput = os.popen("python hello.py")
result = fouput.readlines()
print("result is: %s" % result);

finput = os.popen("python TestInput.py", "w")
finput.write("how are you\n")


f = call("python hello.py", shell=True)
print f

p1 = Popen("python hello.py", stdin = None, stdout = PIPE, shell=True)

p2 = Popen("python TestInput.py", stdin = p1.stdout, stdout = PIPE, shell=True)
print p2.communicate()[0]
#other way
#print p2.stdout.readlines()
Python 相关文章推荐
跟老齐学Python之集合(set)
Sep 24 Python
Python安装使用命令行交互模块pexpect的基础教程
May 12 Python
从局部变量和全局变量开始全面解析Python中变量的作用域
Jun 16 Python
python保存数据到本地文件的方法
Jun 23 Python
解决PyCharm的Python.exe已经停止工作的问题
Nov 29 Python
Python实现图片转字符画的代码实例
Feb 22 Python
Python中关于浮点数的冷知识
Sep 22 Python
Python定义函数时参数有默认值问题解决
Dec 19 Python
Python Numpy 控制台完全输出ndarray的实现
Feb 19 Python
python 实现两个线程交替执行
May 02 Python
Python3自动生成MySQL数据字典的markdown文本的实现
May 07 Python
Python os库常用操作代码汇总
Nov 03 Python
使用Python中的cookielib模拟登录网站
Apr 09 #Python
列举Python中吸引人的一些特性
Apr 09 #Python
Python的Bottle框架的一些使用技巧介绍
Apr 08 #Python
在Python的框架中为MySQL实现restful接口的教程
Apr 08 #Python
简单介绍Python的轻便web框架Bottle
Apr 08 #Python
常见的在Python中实现单例模式的三种方法
Apr 08 #Python
分析Python的Django框架的运行方式及处理流程
Apr 08 #Python
You might like
php实现对两个数组进行减法操作的方法
2015/04/17 PHP
php实现每日签到功能
2018/11/29 PHP
解决thinkPHP 5 nginx 部署时,只跳转首页的问题
2019/10/16 PHP
javascript编程起步(第三课)
2007/02/27 Javascript
javaScript 读取和设置文档元素的样式属性
2009/04/14 Javascript
THREE.JS入门教程(5)你应当知道的十件事
2013/01/24 Javascript
jQuery操作动态生成的内容的方法
2016/05/28 Javascript
学习Bootstrap滚动监听 附调用方法
2016/07/02 Javascript
关于vuex的学习实践笔记
2017/04/05 Javascript
Node.js使用Koa搭建 基础项目
2018/01/08 Javascript
JavaScript数组,JSON对象实现动态添加、修改、删除功能示例
2018/05/26 Javascript
Webpack5正式发布,有哪些新特性
2020/10/12 Javascript
Node.js path模块,获取文件后缀名操作
2020/11/07 Javascript
[03:42]2014DOTA2国际邀请赛 第三日比赛排位扑朔迷离
2014/07/12 DOTA
[56:00]DOTA2上海特级锦标赛主赛事日 - 4 胜者组决赛Secret VS Liquid第一局
2016/03/05 DOTA
[00:56]PWL开团时刻DAY8——追追追追追!
2020/11/09 DOTA
简单介绍Python中的RSS处理
2015/04/13 Python
调试Python程序代码的几种方法总结
2015/04/28 Python
Python实例一个类背后发生了什么
2016/02/09 Python
举例讲解Python中的list列表数据结构用法
2016/03/12 Python
Python中字符串的修改及传参详解
2016/11/30 Python
python 线程的暂停, 恢复, 退出详解及实例
2016/12/06 Python
Python中应该使用%还是format来格式化字符串
2018/09/25 Python
Django CBV与FBV原理及实例详解
2019/08/12 Python
Python学习笔记之列表和成员运算符及列表相关方法详解
2019/08/22 Python
Python基于Tensor FLow的图像处理操作详解
2020/01/15 Python
python TCP包注入方式
2020/05/05 Python
HTML5 CSS3给网站设计带来出色效果
2009/07/16 HTML / CSS
html5使用canvas压缩图片的示例代码
2018/09/11 HTML / CSS
世界上最大的巴士旅游观光公司:Big Bus Tours
2016/10/20 全球购物
全球速卖通法国在线交易平台:AliExpress法国
2017/07/07 全球购物
西班牙多品牌鞋店连锁店:Krack
2018/11/30 全球购物
UNIX特点都有哪些
2016/04/05 面试题
2014年征兵标语
2014/06/20 职场文书
医生党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
刘公岛导游词
2015/02/05 职场文书