Python与shell的3种交互方式介绍


Posted in Python onApril 11, 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!

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的Tornado框架实现一个一对一聊天的程序
Apr 25 Python
Python网络编程之TCP与UDP协议套接字用法示例
Feb 02 Python
python多维数组切片方法
Apr 13 Python
运行django项目指定IP和端口的方法
May 14 Python
使用Python编写Prometheus监控的方法
Oct 15 Python
Python基础教程之异常详解
Jan 10 Python
Python中判断子串存在的性能比较及分析总结
Jun 23 Python
Python实现蒙特卡洛算法小实验过程详解
Jul 12 Python
python实现美团订单推送到测试环境,提供便利操作示例
Aug 09 Python
python之pymysql模块简单应用示例代码
Dec 16 Python
Python如何通过Flask-Mail发送电子邮件
Jan 29 Python
浅谈Tensorflow加载Vgg预训练模型的几个注意事项
May 26 Python
Python函数参数类型*、**的区别
Apr 11 #Python
Python中的多重装饰器
Apr 11 #Python
Python中的各种装饰器详解
Apr 11 #Python
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
Apr 11 #Python
Python返回真假值(True or False)小技巧
Apr 10 #Python
Python选择排序、冒泡排序、合并排序代码实例
Apr 10 #Python
Python字符串中查找子串小技巧
Apr 10 #Python
You might like
浅析PHP水印技术
2007/02/14 PHP
php根据年月获取季度的方法
2014/03/31 PHP
linux下安装php的memcached客户端
2014/08/03 PHP
php实现ip白名单黑名单功能
2015/03/12 PHP
jquery 批量上传图片实现代码
2010/01/28 Javascript
js列举css中所有图标的实现代码
2011/07/04 Javascript
一个CSS+jQuery实现的放大缩小动画效果
2014/02/19 Javascript
JQuery导航菜单选择特效
2016/04/11 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
JS实现Ajax的方法分析
2016/12/20 Javascript
jQuery设置图片等比例缩小的方法
2017/04/29 jQuery
vue中eventbus被多次触发以及踩过的坑
2017/12/02 Javascript
详解如何使用微信小程序云函数发送短信验证码
2019/03/13 Javascript
JS自定义滚动条效果
2020/03/13 Javascript
[01:02:02]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第二局
2016/02/25 DOTA
python解决字典中的值是列表问题的方法
2013/03/04 Python
python字符串加密解密的三种方法分享(base64 win32com)
2014/01/19 Python
Zabbix实现微信报警功能
2016/10/09 Python
python、java等哪一门编程语言适合人工智能?
2017/11/13 Python
Python实现Kmeans聚类算法
2020/06/10 Python
详谈Numpy中数组重塑、合并与拆分方法
2018/04/17 Python
Numpy将二维数组添加到空数组的实现
2019/12/05 Python
详解python安装matplotlib库三种失败情况
2020/07/28 Python
PyTorch如何搭建一个简单的网络
2020/08/24 Python
Python lxml库的简单介绍及基本使用讲解
2020/12/22 Python
春秋航空官方网站:Spring Airlines
2017/09/27 全球购物
Expedia丹麦:全球领先的旅游网站
2018/03/18 全球购物
美国排名第一的泳池用品直接来源:In The Swim
2019/09/23 全球购物
this关键字的作用
2016/01/30 面试题
建设投标担保书
2014/05/13 职场文书
党员干部反四风民主生活会对照检查材料思想汇报
2014/10/12 职场文书
教师自荐信范文
2015/03/06 职场文书
因公司原因离职的辞职信范文
2015/05/12 职场文书
行政处罚告知书
2015/07/01 职场文书
2019最新版劳务派遣管理制度
2019/08/16 职场文书
《月歌。》宣布制作10周年纪念剧场版《RABBITS KINGDOM THE MOVIE》
2022/04/02 日漫