Python与shell交互os.system、 os.popen、 subprocess

el/2024/7/17 22:18:10

这篇文章主要介绍了Python与shell的3种交互方式介绍,本文讲解了

os.system、

os.popen、

subprocess

模块等3种方法,需要的朋友可以参考下。

 

问题概述

考虑这样一个问题,有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命令单向交互,不能双向交互.

1)返回程序输出流,用fouput变量连接到输出流

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

输出:

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

 

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

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

输出:

input string is: how are you (看上面TestInput.py文件代码)

 

3.利用subprocess模块

1) subprocess.call()

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

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

输出:

hello, world!

 

 

2) 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]
#其他方式
#print  p2.stdout.readlines()

输出:

input string is: hello, world!

 

 

4.代码整合

 

整合代码如下:

#!/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()

 

 

 


http://www.ngui.cc/el/5557105.html

相关文章

浏览器页面的缓存设置(不缓存设置)

HTML的HTTP协议头信息中控制着页面在几个地方的缓存信息,包括浏览器端,中间缓存服务器端(如:squid等),Web服务器端。本文讨论头信息 中带缓存控制信息的HTML页面(JSP/Servlet生成好出来的也是HTML页面)在中间缓存服务器中的缓存情…

信号、信号量、进程的状态的区别你知道吗?

信号量(Semaphore),有时被称为信号灯,是在多环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。 在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线…

网关的作用(两个内网主机通信原理)

网关是一种充当转换重任的计算机系统或设备。在使用不同的通信协议、数据格式或语言,甚至体系结构完全不同的两种系统之间,网关是一个翻译器。与网桥只是简单地传达信息不同,网关对收到的信息要重新打包,以适应目的系统的需求。同时&#xff…

python中 if __name__ == '__main__': 的解析

当你打开一个.py文件时,经常会在代码的最下面看到 if __name__ __main__: ,现在就来介绍一下它的作用. 模块是对象,并且所有的模块都有一个内置属性 __name__。一个模块的 __name__ 的值取决于您如何应用模块。( 1 )如果 import 一个模块&a…

正则表达式 学习手册三

javascript表达式举例: 举例:匹配IP地址 100.4.5.6 var reg /^ ( (?: (?: 25[0-5] | 2[0-4] \d | ( (1\d{2}) |([1-9]?\d)) ) \. ) {3} (?:25[0-5]|2[0-4] \d | ( (1\d{2}) | ([1-9]?\d) ) ) ) $/; if (!reg.test($(#master).val())) …

区块链技术介绍----分布式总帐

区块链(Blockchain)是比特币的底层技术,像一个数据库账本,记载所有的交易记录。这项技术也因其安全、便捷的特性逐渐得到了银行与金融业的关注。 ​区块链(Blockchain)是比特币的一个重要概念,区块链是一串使用密码学方法相关联产生的数据块&…

正则表达式 高级规则——四(贪婪与非贪婪)

匹配次数中的贪婪与非贪婪 在使用修饰匹配次数的特殊符号时,有几种表示方法可以使同一个表达式能够匹配不同的次数,比如:"{m,n}", "{m,}", "?", "*","",具体匹配的次数随被匹…

正则表达式高级用法---五(反向引用 /1, /2...)

反向引用 /1, /2... 表达式在匹配时,表达式引擎会将小括号 "( )" 包含的表达式所匹配到的字符串记录下来。在获取匹配结果的时候,小括号包含的表达式所匹配到的字符串可以单独获取。这一点,在前面的举例中,已经多次展示…

正则表达式---六(其他通用规则)

还有一些在各个正则表达式引擎之间比较通用的规则,在前面的讲解过程中没有提到。 4.1 规则一 表达式中,可以使用 "/xXX" 和 "/uXXXX" 表示一个字符("X" 表示一个十六进制数) 形式 …

python教程-windows如何安装pygame

个人经历: 安装pygame时傻傻的花费很多时间历。首先描述一下安装环境,我的电脑时win10的64位系统,安装时没考虑就安装了python-3.2.5.amd64,64位编译器。然后再安装pygame 32位时,怎么也没有安装成功。原因是pygame库只…