作者:mobiledu2502886187 | 来源:互联网 | 2023-05-18 19:54
问题详细一点:譬如我在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 个解决方案
我随便灌一下水。。
如果是linux下可以方便的用管道解决。。可惜楼主是用windows
6楼你的我尝试过了,但是没有任何输出...
感谢你的帮助.
这样呢?
import os
(si, so, se) = os.popen3('test.exe')
so.readlines()
我尝试过了,有输出啊!
[code]
import os
p = os.popen("dir")
out = p.read()
print out
[/code]
>>> 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 可用字节
>>>
可以把test源代码帖出来看看,是不是有什么问题?
首先非常感谢大家的帮助,可以肯定那个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
一会我尝试一下,看能不能,非常感谢,感觉应该可以的,试过马上来汇报,:)
不是抓不到那个进程,ShellExecute函数并不能读取所执行的文件的输出,只可以通过其返回值来判断是否执行成功,如果成功则返回该进程句柄,失败则返回错误代码,一般返回值小于32,则表示执行失败。要想得到执行文件的输出,还是需要os.popen的。
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的问题,是想把这个功能用的一个大的控制台程序里,没想到到这个小的程序就卡住了...唉,郁闷.
再次感谢大家关注.
估计你的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盘下
to:lf8289
输入这个是可行的,我现在就是抓不到它返回的那个"Function 'go' success"
我把输入输进去了,但是print r.read()就什么打印都没有...很郁闷
我在后面加了个 print "exit"
但好像根本都运行不到...感觉好像是哪里阻塞了...我再调试调试,唉,被这个问题搞了快一个礼拜了...头都大了,感觉不应该很难的问题.
我尝试了r.write(s)会报错
IOError:[Errno 22] Invalid argument
import subprocess as sub
p=sub.Popen('path',shell=True,stdout=sub.PIPE)
a=p.communicate()
print a
恩,这个我试过了,不过我要退出那个subprocess才能一起打印所有的信息...
可能之前不行的也是这个原因,谢谢各位,我再想想其它办法.
有同步的方法么就是有输出就马上输出出来的那种?
不管怎样,周末揭帖...
如果是缓冲问题,那就不太好办了。从管道里启动的进程,stdout相当于被重定向到文件,变成全缓冲的了。所以要等程序结束才一起打印出来。如果你能修改子进程代码,最好是把缓冲设为0,或者每次输出之后都手动刷新下。
非常感谢imabic,和大家的帮助,我把帖子加分再揭帖.