热门标签 | 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,和大家的帮助,我把帖子加分再揭帖.

推荐阅读
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 解决文件名过长下载失败问题的jQuery方案
    本文介绍了使用jQuery解决文件名过长导致下载失败的问题。原方案中存在文件名部分丢失的问题,通过动态生成隐藏域表单并提交的方式来解决。详细的解决方案和代码示例在文章中给出。 ... [详细]
  • 如何在HTML中获取鼠标的当前位置
    本文介绍了在HTML中获取鼠标当前位置的三种方法,分别是相对于屏幕的位置、相对于窗口的位置以及考虑了页面滚动因素的位置。通过这些方法可以准确获取鼠标的坐标信息。 ... [详细]
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社区 版权所有