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中实现的RC4算法
Feb 14 Python
Python使用matplotlib绘制动画的方法
May 20 Python
python删除本地夹里重复文件的方法
Nov 19 Python
django反向解析和正向解析的方式
Jun 05 Python
python pandas.DataFrame选取、修改数据最好用.loc,.iloc,.ix实现
Jun 11 Python
解决pyinstaller打包pyqt5的问题
Jan 08 Python
python从入门到精通 windows安装python图文教程
May 18 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
Jun 21 Python
Python编写一个验证码图片数据标注GUI程序附源码
Dec 09 Python
使用Python脚本从文件读取数据代码实例
Jan 19 Python
公认8个效率最高的爬虫框架
Jul 28 Python
python 实现汉诺塔游戏
Nov 28 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用户注册时常用的检验函数实例总结
2014/12/22 PHP
PHP MSSQL 分页实例
2016/04/13 PHP
PHP实现的折半查询算法示例
2017/10/09 PHP
php+redis消息队列实现抢购功能
2018/02/08 PHP
PHP+redis实现微博的推模型案例分析
2019/07/10 PHP
tp5.1框架数据库子查询操作实例分析
2020/05/26 PHP
在一个js文件里远程调用jquery.js会在ie8下的一个奇怪问题
2010/11/28 Javascript
jquery动画2.元素坐标动画效果(创建一个图片走廊)
2012/08/24 Javascript
Jquery为a标签的href赋值实现代码
2013/05/03 Javascript
JavaScript DOM元素尺寸和位置
2015/04/13 Javascript
在JavaScript中处理数组之reverse()方法的使用
2015/06/09 Javascript
关于微信中a链接无法跳转问题
2016/08/02 Javascript
Bootstrap popover用法详解
2016/12/22 Javascript
BootStrap Table对前台页面表格的支持实例讲解
2016/12/22 Javascript
Vue.js项目模板搭建图文教程
2017/09/20 Javascript
在 Typescript 中使用可被复用的 Vue Mixin功能
2018/04/17 Javascript
详解处理bootstrap4不支持远程静态框问题
2018/07/20 Javascript
详解Vuex下Store的模块化拆分实践
2019/07/31 Javascript
解决vant title-active-color与title-inactive-color不生效问题
2020/11/03 Javascript
详解Vue2的diff算法
2021/01/06 Vue.js
python设计模式大全
2016/06/27 Python
同时安装Python2 & Python3 cmd下版本自由选择的方法
2017/12/09 Python
pandas 对每一列数据进行标准化的方法
2018/06/09 Python
pycharm配置当鼠标悬停时快速提示方法参数
2019/07/31 Python
python数据处理之如何选取csv文件中某几行的数据
2019/09/02 Python
Python利用逻辑回归分类实现模板
2020/02/15 Python
keras 实现轻量级网络ShuffleNet教程
2020/06/19 Python
iphoneX 适配客户端H5页面的方法教程
2017/12/08 HTML / CSS
墨西哥皇宫度假村预订:Palace Resorts
2018/06/16 全球购物
Reebok官方旗舰店:美国知名健身品牌锐步
2019/01/07 全球购物
Java Servlet API中forward() 与redirect()的区别
2014/04/20 面试题
计算机专业自荐信
2014/05/24 职场文书
企业公益活动策划方案
2014/08/24 职场文书
财务务虚会发言材料
2014/10/20 职场文书
改进工作作风心得体会
2016/01/23 职场文书
Python 机器学习工具包SKlearn的安装与使用
2021/05/14 Python