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实现将16进制字符串转化为ascii字符的方法分析
Jul 21 Python
Python学习笔记之if语句的使用示例
Oct 23 Python
彻底理解Python list切片原理
Oct 27 Python
Python获取二维矩阵每列最大值的方法
Apr 03 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
Oct 11 Python
python 实现调用子文件下的模块方法
Dec 07 Python
python列表,字典,元组简单用法示例
Jul 11 Python
python的faker库用法
Nov 28 Python
Python文件操作函数用法实例详解
Dec 24 Python
对Tensorflow中tensorboard日志的生成与显示详解
Feb 04 Python
Python递归求出列表(包括列表中的子列表)的最大值实例
Feb 27 Python
python except异常处理之后不退出,解决异常继续执行的实现
Apr 25 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
Js的MessageBox
2006/12/03 Javascript
JQuery里选择超链接的实现代码
2011/05/22 Javascript
jQuery EasyUI API 中文文档 - Parser 解析器
2011/09/29 Javascript
JavaScript实现N皇后问题算法谜题解答
2014/12/29 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件包装
2015/11/20 Javascript
javascript之IE版本检测超简单方法
2016/08/20 Javascript
JS中用childNodes获取子元素换行会产生一个子元素
2016/12/08 Javascript
ECMAScript6 新特性范例大全
2017/03/24 Javascript
JS实现移动端按首字母检索城市列表附源码下载
2017/07/05 Javascript
浅谈Koa服务限流方法实践
2017/10/23 Javascript
详解vue mixins和extends的巧妙用法
2017/12/20 Javascript
JavaScript实现一个简易的计算器实例代码
2018/05/10 Javascript
Angular中sweetalert弹框的基本使用教程
2018/07/22 Javascript
JavaScript模板引擎原理与用法详解
2018/12/24 Javascript
基于vue、react实现倒计时效果
2019/08/26 Javascript
JavaScript 面向对象基础简单示例
2019/10/02 Javascript
vuex 实现getter值赋值给vue组件里的data示例
2019/11/05 Javascript
JavaScript数组排序功能简单实现
2020/05/14 Javascript
vue-cli3 热更新配置操作
2020/09/18 Javascript
[01:00]一分钟回顾2018DOTA2亚洲邀请赛现场活动
2018/04/07 DOTA
Python实现将sqlite数据库导出转成Excel(xls)表的方法
2017/07/17 Python
python实现感知器算法(批处理)
2019/01/18 Python
python实现扫描ip地址的小程序
2019/04/16 Python
elasticsearch python 查询的两种方法
2019/08/04 Python
Python实现网页截图(PyQT5)过程解析
2019/08/12 Python
python如何爬取动态网站
2020/09/09 Python
CSS3实现菜单悬停效果
2020/11/17 HTML / CSS
ProBikeKit美国官网:自行车套件,跑步和铁人三项套件
2016/10/13 全球购物
La Senza官网:北美顶尖性感内衣品牌
2018/08/03 全球购物
德国在线订购鲜花:Fleurop
2018/08/25 全球购物
Aosom西班牙:家具在线商店
2020/06/11 全球购物
《听鱼说话》教学反思
2014/02/15 职场文书
小学评语大全
2014/04/22 职场文书
打架检讨书
2015/01/27 职场文书
一道JS算法面试题——冒泡、选择排序
2021/04/21 Javascript
Python语言中的数据类型-序列
2022/02/24 Python