在很久以前,我写了一个系列,Python和C和C++的交互,如下

http://blog.csdn.net/marising/archive/2008/08/28/2845339.aspx

目的是解决Python和C/C++的互操作性的问题,假如性能瓶颈的地方用C来写,而一些外围工作用Python来完成,岂不是完美的结合。

今天发现了更方便的方式,就是用subprocess模块,创建子进程,然后用管道来进行交互,而这种方式在shell中非常普遍,比如:cat xxx.file | test.py 就是用的管道,另外,在hadoop中stream模式就是用的管道。

其实在python中,和shell脚本,其他程序交互的方式有很多,比如:

os.system(cmd),os.system只是执行一个shell命令,不能输入、且无返回

os.open(cmd),可以交互,但是是一次性的,调用都少次都会创建和销毁多少次进程,性能太差

所以,建议用subprocess,但是subprocess复杂一些,可以参考python docs:

http://docs.python.org/library/subprocess.html

先看一个简单的例子,调用ls命令,两者之间是没有交互的:

[python] view plaincopy
  1. import subprocess
  2. p = subprocess.Popen('ls')

再看在程序中获取输出的例子:

[c-sharp] view plaincopy
  1. import subprocess
  2. p = subprocess.Popen('ls',stdout=subprocess.PIPE)
  3. print p.stdout.readlines()

再看看有输入,有输出的例子,父进程发送'say hi',子进程输出 test say hi,父进程获取输出并打印

[python] view plaincopy
  1. #test1.py
  2. import sys
  3. line = sys.stdin.readline()
  4. print 'test',line
  5. #run.py
  6. from subprocess import *
  7. p =Popen('./test1.py',stdin=PIPE,stdout=PIPE)
  8. p.stdin.write('say hi/n')
  9. print p.stdout.readline()
  10. #result
  11. test say hi

看看连续输入和输出的例子

test.py

[python] view plaincopy
  1. import sys
  2. while True:
  3. line = sys.stdin.readline()
  4. if not line:break
  5. sys.stdout.write(line)
  6. sys.stdout.flush()

run.py

[python] view plaincopy
  1. import sys
  2. from subprocess import *
  3. proc = Popen('./test.py',stdin=PIPE,stdout=PIPE,shell=True)
  4. for line in sys.stdin:
  5. proc.stdin.write(line)
  6. proc.stdin.flush()
  7. output = proc.stdout.readline()
  8. sys.stdout.write(output)

注意,run.py的flush和test.py中的flush,要记得清空缓冲区,否则程序得不到正确的输入和输出

C/C++的类似,伪代码如下

[cpp] view plaincopy
  1. char* line = new char[2048];
  2. while (fgets(line, 2028, stdin)) {
  3. printf(line);
  4. fflush(stdout);//必须清空缓冲区
  5. }

Popen对象

该对象提供有不少方法函数可用。而且前面已经用到了wait()/poll()/communicate()

poll()

检查是否结束,设置返回值

wait()

等待结束,设置返回值

communicate()

参数是标准输入,返回标准输出和标准出错

send_signal()

发送信号 (主要在unix下有用)

terminate()

终止进程,unix对应的SIGTERM信号,windows下调用api函数TerminateProcess()

kill()

杀死进程(unix对应SIGKILL信号),windows下同上

stdin
stdout
stderr

参数中指定PIPE时,有用

pid

进程id

returncode

进程返回值

参考

Popen其他参数的设置,请参考python docs。

转载于:https://www.cnblogs.com/chenjianhong/p/4144476.html

Python的subprocess子进程和管道进行交互相关推荐

  1. python实时获取子进程输出_Python 从subprocess运行的子进程中实时获取输出的例子...

    有些时候,我们需要将某些程序放到子进程中去运行,以达到整合系统的目的.在Python中,一个非常好的选择就是使用subprocess模块,本模块为开辟子进程去执行子程序提供了统一的接口,更加便于学习和 ...

  2. python 内置模块 subprocess

    1.介绍 subprocess模块可以生成新的进程,连接到它们的input/output/error管道,同时获取它们的返回码. 2.基本操作方法 2.1.subprocess的run.call.ch ...

  3. Python之subprocess模块

    subprocess模块允许你启动一个新的进程,连接输入/输出/错误的管道,  获得子进程的返回码.这个模块目标是代替一些老的模块,比如os.system和os.spawn. 0x01 常见subpr ...

  4. 【Python】python之subprocess模块详解

    [Python]python之subprocess模块详解 subprocess模块 subprocess是Python 2.4中新增的一个模块,它允许你生成新的进程,连接到它们的 input/out ...

  5. python的subprocess模块

    1 os与commands模块 ​ 2 subprocess模块 ​ 3 subprocess.Popen类 我们几乎可以在任何操作系统上通过命令行指令与操作系统进行交互,比如Linux平台下的she ...

  6. python subprocess_python subprocess - 刘江的python教程

    subprocess 阅读: 19172 评论:0 subprocess模块主要用于创建子进程,并连接它们的输入.输出和错误管道,获取它们的返回状态.通俗地说就是通过这个模块,你可以在Python的代 ...

  7. Python的subprocess模块(一)

    原文连接:http://www.cnblogs.com/wang-yc/p/5624880.html 一.简介 subprocess最早在2.4版本引入.用来生成子进程,并可以通过管道连接他们的输入/ ...

  8. Python实战之子进程

    Python实战之子进程 最近做一个小工具需要用到Python的字进程,看了一下Python的API,subprocess模块可以就可以实现,并且还挺简单 要实现一个简单的自进程,只需要 [pytho ...

  9. Python模块subprocess小记

    在熟悉了Qt的QProcess以后,再回头来看python的subprocess总算不觉得像以前那么恐怖了. 和QProcess一样,subprocess的目标是启动一个新的进程并与之进行通讯. su ...

最新文章

  1. spring data jpa 详解
  2. 宏基因组实战7. bwa序列比对, samtools查看, bedtools丰度统计
  3. 【转载保存】接口的压力测试工具
  4. Spring mvc 文件上传
  5. skinmagic对VC中程序窗口的换肤
  6. 知道吗?BAT去年在KDD上作为第一单位发表了12篇文章!(内附每篇文章解读)...
  7. js 如何拿到后天的时间_js获取日期及日期相关js方法 积累总结
  8. 蚂蚁链发布BTN,有什么用?
  9. opencv 摄像机标定
  10. 基金API数据接口,股票API数据接口
  11. Leetcode 235. Lowest Common Ancestor of a Binary Search Tree
  12. JavaEE中的依赖性——依赖性注入
  13. centeros域名解析失败
  14. Godaddy上的域名如何取消自动续费?
  15. 基于medianflow的半自动标注数据程序
  16. 华为鸿蒙麒麟玉兔_华为注册了整本《山海经》的商标?“鸿蒙”操作系统成功申请...
  17. 微软帝国踏上Windows7征途(图)
  18. Xilinx官网大全__PowerPC 架构
  19. 戴着脑电帽去旅游 ——浅谈旅游研究中脑电技术的应用
  20. 原谅我不是一个阳光的男孩

热门文章

  1. FireDAC 下的 Sqlite [7] - 备份、优化、事务(Transaction)
  2. 为何jsp 在resin下乱码,但在tomcat下却工作良好的问题
  3. SpringBoot配置属性之DataSource
  4. Css中路径data用法
  5. 用vs2008打开vs2012项目
  6. 返朴归真,也谈面向对象编程的几个原则
  7. automation服务器不能创建对象”的问题的解决方案总结大全
  8. java类Timer和TimerTask的使用
  9. mvd没什么每次参数双都多一个逗号_学服装设计后,家里多了哪些奇怪又可爱的宝藏物品?...
  10. 【错误记录】编译 Linux 内核报错 ( fatal error: openssl/opensslv.h: No such file or directory )