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定时器使用示例分享
Feb 16 Python
Python scikit-learn 做线性回归的示例代码
Nov 01 Python
Python爬虫包BeautifulSoup异常处理(二)
Jun 17 Python
python矩阵的转置和逆转实例
Dec 12 Python
使用Django2快速开发Web项目的详细步骤
Jan 06 Python
python打造爬虫代理池过程解析
Aug 15 Python
matlab中imadjust函数的作用及应用举例
Feb 27 Python
Selenium基于PIL实现拼接滚动截图
Apr 10 Python
Python参数传递及收集机制原理解析
Jun 05 Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
Jul 03 Python
Python如何定义接口和抽象类
Jul 28 Python
Python写情书? 10行代码展示如何把情书写在她的照片里
Apr 21 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
web目录下不应该存在多余的程序(安全考虑)
2012/05/09 PHP
php实现的简单检验登陆类
2015/06/18 PHP
PHP实现通过URL提取根域名
2016/03/31 PHP
PHP使用file_get_contents发送http请求功能简单示例
2018/04/29 PHP
基于JQuery的一个简单的鼠标跟随提示效果
2010/09/23 Javascript
你必须知道的Javascript知识点之"深入理解作用域链"的介绍
2013/04/23 Javascript
单击浏览器右上角的X关闭窗口弹出提示的小例子
2013/06/12 Javascript
js实现快速分享功能(你的文章分享工具)
2013/06/25 Javascript
JQuery的ready函数与JS的onload的区别详解
2013/11/21 Javascript
jquery使用ajax实现微信自动回复插件
2014/04/28 Javascript
JavaScript函数作用域链分析
2015/02/13 Javascript
基于jQuery实现点击最后一行实现行自增效果的表格
2016/01/12 Javascript
weUI应用之JS常用信息提示弹层的封装
2016/11/21 Javascript
解决Vue编译时写在style中的路径问题
2017/09/21 Javascript
js操作二进制数据方法
2018/03/03 Javascript
JS动画定时器知识总结
2018/03/23 Javascript
Vue2.x中利用@font-size引入字体图标报错的解决方法
2018/09/28 Javascript
使用angularjs.foreach时return的问题解决
2018/09/30 Javascript
关于微信小程序map组件z-index的层级问题分析
2019/07/09 Javascript
layui table数据修改的回显方法
2019/09/04 Javascript
python计算N天之后日期的方法
2015/03/31 Python
python比较2个xml内容的方法
2015/05/11 Python
ubuntu安装mysql pycharm sublime
2018/02/20 Python
python 找出list中最大或者最小几个数的索引方法
2018/10/30 Python
python tkinter canvas使用实例
2019/11/04 Python
美国高级工作服品牌:Carhartt
2018/01/25 全球购物
H&M旗下高端女装品牌:& Other Stories
2018/05/07 全球购物
Proenza Schouler官方网站:纽约女装和配饰品牌
2019/01/03 全球购物
Bose英国官方网站:美国知名音响品牌
2020/01/26 全球购物
个人求职信范文分享
2013/12/13 职场文书
竞选大队干部演讲稿
2014/09/11 职场文书
个人贷款授权委托书样本
2014/10/07 职场文书
2015年党风廉政建设责任书
2015/01/29 职场文书
远程教育集中轮训基层干部培训班学习心得体会
2016/01/09 职场文书
详解nginx.conf 中 root 目录设置问题
2021/04/01 Servers
WinServer2012搭建DNS服务器的方法步骤
2022/06/10 Servers