热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

请问python如何抓取命令行程序的输出

问题详细一点:譬如我在E:\下有个test.exe(win32的console程序)该程序执行函数go:完成1+1等于2,并在屏幕中打印结果2,并且打印Functiongosucc
问题详细一点:
譬如我在E:\下有个test.exe(win32 的console程序)
该程序执行函数go:完成1+1等于2,并在屏幕中打印结果2,并且打印"Function 'go' success!"
我用python直接调用它,并对其传入对应命令go,这些都完成了,就是想抓取这个函数的执行成功与否的信息,不知如何抓取.
我查询了一些资料,发现里面用的是os.pipe()或者Popen()我按照网上类似的例子好像都有问题,所以没有解决.
请高手指点...非常感谢...
本人本着有问题先自己解决,解决不了到网上找,最后在发问的想法,因为现在确实找不到,查工具书,发现工具书里面也只是简单的介绍函数,并没有实际的例子...特此求教,谢谢!

23 个解决方案

#1


自己顶拉,希望高手来看下!

#2


>>> import os
>>> r = os.popen("echo abc")
>>> r.read()
'abc\n'

#3


我随便灌一下水。。
如果是linux下可以方便的用管道解决。。可惜楼主是用windows

#4


楼上的什么意思?Windows就没管道?

#5


引用 2 楼 iambic 的回复:
Python code>>> import os
>>> r = os.popen("echo abc")
>>> r.read()
'abc\n'


请问2楼的能详细一点么,我比较想知道怎么和我帖子里面的test.exe进行链接.抑或这个abc代表的就是要链接的exe么?
麻烦了,谢谢谢谢.

#6


这样试试看
import os
t = os.popen("test.exe")
r = t.read()
print r

#7


6楼你的我尝试过了,但是没有任何输出...
感谢你的帮助.

#8


这样呢?
import os
(si, so, se) = os.popen3('test.exe')
so.readlines()

#9


结果就得到了一个  []

#10


我尝试过了,有输出啊!

[code]
import os
p = os.popen("dir")
out = p.read()
print out
[/code]

#11


>请问2楼的能详细一点么,我比较想知道怎么和我帖子里面的test.exe进行链接.
>抑或这个abc代表的就是要链接的exe么? 
>>> import os
>>> r = os.popen("test.exe")
>>> r.read()
'abc\n'


但是请先执行下:
>>> import os
>>> r = os.system("test.exe")

看看有没有输出。如果没有输出,那可能是你的test.exe有问题。

#12


>>> import os
>>> child_stdin, child_stdout, child_stderr = os.popen3("dir c:")
>>> r = child_stdout.readlines()
>>> for line in r:
print line,


 驱动器 C 中的卷是 BOOT
 卷的序列号是 B815-81F3

 C:\Python25 的目录

2008-09-04  19:44              .
2008-09-04  19:44              ..
2008-08-21  13:27              DLLs
2008-06-18  09:48              Doc
2008-06-18  09:48              include
2008-08-21  13:51              Lib
2008-06-18  09:48              libs
2008-02-21  13:05            14,013 LICENSE.txt
2004-12-16  18:22           499,712 msvcp71.dll
2004-12-16  18:22           348,160 msvcr71.dll
2008-02-21  13:05           119,048 NEWS.txt
2008-08-21  13:02            17,693 PIL-wininst.log
2008-08-21  13:24             5,789 pisa-wininst.log
2008-08-21  11:09             2,977 pyPdf-wininst.log
2008-03-27  18:12            24,064 python.exe
2005-01-25  14:00               631 python.exe.manifest
2008-03-27  18:12            24,064 python25.exe
2008-03-27  18:12            24,576 pythonw.exe
2005-01-25  14:00               631 pythonw.exe.manifest
2008-03-27  18:12            24,576 pythonw25.exe
2008-02-21  13:05            56,354 README.txt
2008-06-18  09:48            61,440 RemoveMySQL-python.exe
2008-08-21  13:02            61,440 RemovePIL.exe
2008-08-21  13:24            61,440 Removepisa.exe
2008-06-18  11:45            61,440 Removepymssql.exe
2008-08-21  11:09            61,440 RemovepyPdf.exe
2008-08-21  17:52              scripts
2008-06-18  09:48              tcl
2008-08-06  18:10             1,387 tkunzip.log
2008-06-18  09:48              Tools
2004-06-10  18:21           219,136 unicows.dll
2008-08-06  18:10            73,819 unins000.dat
2008-08-06  18:10           695,578 unins000.exe
2008-03-27  18:12             4,608 w9xpopen.exe
              24 个文件      2,464,016 字节
              10 个目录  3,831,152,640 可用字节
>>> 

#13


可以把test源代码帖出来看看,是不是有什么问题?

#14


首先非常感谢大家的帮助,可以肯定那个test.exe没什么问题的,就是一个很简单的程序,main里面call函数go然后执行,然后就是print成功的返回信息,iambic你的那个os.system("test.exe")是调用test.exe,我用的是win32api.ShellExecute(0,'open','d:\test.exe',None,None,1)是不是因为这个抓不到那个进程?
tim_spac
一会我尝试一下,看能不能,非常感谢,感觉应该可以的,试过马上来汇报,:)

#15


不是抓不到那个进程,ShellExecute函数并不能读取所执行的文件的输出,只可以通过其返回值来判断是否执行成功,如果成功则返回该进程句柄,失败则返回错误代码,一般返回值小于32,则表示执行失败。要想得到执行文件的输出,还是需要os.popen的。

#16


TO:lf8289
os.popen,我尝试过了,但是感觉就是跟我的那个程序挂不上一样
我的代码是这样的,但是没有反映的,就跟我直接启动test.exe是一样的,就是等待输入的状态

import os

os.system('D:\test.exe')
(si,so,se) = os.popen3('test.exe')

t = so.resdlines()
for line in t
    print line

程序执行就是在等待输入,好像没有抓到一样.

TO:iambic

我还尝试了你的代码

import os
r = os.system('D:\test.exe')
r = os.popen('test.exe')
r.read()
print r

好像也不起作用

另外,我输入字符是用的win32gui模块
my_handle = win32gui.FindWindow(None,'D:\test.exe')

win32gui.SendMessage(my_handle,win32con.WM_CHAR,ord('g'),0)
win32gui.SendMessage(my_handle,win32con.WM_CHAR,ord('0'),0)
win32gui.SendMessage(my_handle,win32con.WM_CHAR,13,0)

上面就是找窗口句柄,发送"go"然后回车
就是抓不到返回信息,这个test.exe就是一个测试用的,里面没什么东西,应该不会是test.exe的问题,是想把这个功能用的一个大的控制台程序里,没想到到这个小的程序就卡住了...唉,郁闷.
再次感谢大家关注.

#17


估计你的test.exe主要是想等待一个输入,然后调用该输入串所对应的函数吧。
你用os.popen和ShellExecute时候,并没有单独出现一个test.exe的运行窗口,而你下面用win32gui模块发送字符串时就没有成功,以至于test.exe一直等待输入,从而阻塞。(个人猜测)
你可以用以下思路尝试一下(没有测试过):
a.py

import os
r = os.popen('test.ext', 'w')
s = raw_input()
r.write(s)
print r.read()

my_handle = win32gui.FindWindow(None, 'd:\a.py')    #假设你的a.py放在d盘下

#18


to:lf8289
输入这个是可行的,我现在就是抓不到它返回的那个"Function 'go' success"
我把输入输进去了,但是print r.read()就什么打印都没有...很郁闷
我在后面加了个 print "exit"
但好像根本都运行不到...感觉好像是哪里阻塞了...我再调试调试,唉,被这个问题搞了快一个礼拜了...头都大了,感觉不应该很难的问题.

#19


我尝试了r.write(s)会报错
IOError:[Errno 22] Invalid argument

#20


import subprocess as sub
p=sub.Popen('path',shell=True,stdout=sub.PIPE)
a=p.communicate()
print a

#21


恩,这个我试过了,不过我要退出那个subprocess才能一起打印所有的信息...
可能之前不行的也是这个原因,谢谢各位,我再想想其它办法.
有同步的方法么就是有输出就马上输出出来的那种?
不管怎样,周末揭帖...

#22


如果是缓冲问题,那就不太好办了。从管道里启动的进程,stdout相当于被重定向到文件,变成全缓冲的了。所以要等程序结束才一起打印出来。如果你能修改子进程代码,最好是把缓冲设为0,或者每次输出之后都手动刷新下。

#23


非常感谢imabic,和大家的帮助,我把帖子加分再揭帖.

推荐阅读
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • Webpack 初探:Import 和 Require 的使用
    本文介绍了 Webpack 中 Import 和 Require 的基本概念和使用方法,帮助读者更好地理解和应用模块化开发。 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 本文介绍了如何使用Python的Paramiko库批量更新多台服务器的登录密码。通过示例代码展示了具体实现方法,确保了操作的高效性和安全性。Paramiko库提供了强大的SSH2协议支持,使得远程服务器管理变得更加便捷。此外,文章还详细说明了代码的各个部分,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 通过将常用的外部命令集成到VSCode中,可以提高开发效率。本文介绍如何在VSCode中配置和使用自定义的外部命令,从而简化命令执行过程。 ... [详细]
  • Linux下MySQL 8.0.28安装指南
    本文详细介绍了在Linux系统上安装MySQL 8.0.28的步骤,包括下载数据库、解压数据包、安装必要组件和启动MySQL服务。 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • 本文详细介绍了如何在 Django 项目中使用 Admin 管理后台,包括创建超级用户、启动项目、管理数据模型和修改用户密码等步骤。 ... [详细]
  • Python错误重试让多少开发者头疼?高效解决方案出炉
    ### 优化后的摘要在处理 Python 开发中的错误重试问题时,许多开发者常常感到困扰。为了应对这一挑战,`tenacity` 库提供了一种高效的解决方案。首先,通过 `pip install tenacity` 安装该库。使用时,可以通过简单的规则配置重试策略。例如,可以设置多个重试条件,使用 `|`(或)和 `&`(与)操作符组合不同的参数,从而实现灵活的错误重试机制。此外,`tenacity` 还支持自定义等待时间、重试次数和异常处理,为开发者提供了强大的工具来提高代码的健壮性和可靠性。 ... [详细]
  • Unity与MySQL连接过程中出现的新挑战及解决方案探析 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
author-avatar
mobiledu2502886187
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有