python与exe交互?

python与exe交互?

有一个exe程序  类似与命令行程序

需要不断的输入 得到不同的输出结果

现在用python 与其交互

使 该exe程序 为一个子进程运行

python 输入到exe程序 ,并得到输出来处理

根据输出结果再次 交互

直到用户退出

请问如何编写?
使用exec()应该可以


QUOTE:
原帖由 xichen 于 2007-3-2 21:49 发表
使用exec()应该可以

这样的话

怎么交互输入输出

给个示范

谢谢
--->
<---
表示输入命令或输出的流向



python -- cmd1  -> a
           a计算
python <-- output1 - a
python  根据output1 得到 cmd2
python -- cmd2 --> a 再根据结果计算
python <--output2 - a
python  根据output2 得到 cmd3
python -- cmd3 --> a 再根据结果计算
python <--output3 - a

go on  ........


要求很简单 只是和一个应用程序交互

实现类似于人与shell或cmd交互

1  通过python发送一条命令到应用程序

2  然后python得到输出  根据一定规则算出下一条新命令

3  再次发送新命令给应用程序 回到了 1

重复以上过程 直到发送退出命令


popen2并不能达到要求
看test4.py为了读取输出必须关闭输入
那么就不能进行下一次输入了


test4.py有 close语句就有正确的输出
test3.py没 有 close语句就没有输出

[Copy to clipboard] [ - ]
CODE:
C:\Documents and Settings\duffor\BIN>type test4.py
import popen2
a,b=popen2.popen2('cmd')
b.write('dir \n')
b.close()
print a.read()


C:\Documents and Settings\duffor\BIN>c:\Python25\python.exe test4.py
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

C:\Documents and Settings\duffor\BIN>dir
驱动器 C 中的卷没有标签。
卷的序列号是 8419-16AF

C:\Documents and Settings\duffor\BIN 的目录

2007-03-03  23:23    <DIR>          .
2007-03-03  23:23    <DIR>          ..
2006-11-20  22:06           145,032 ELEEYE.BIN
2007-01-27  13:31            94,208 ELEEYE.EXE
2007-03-03  23:00             1,235 test.py
2007-03-03  16:35             3,010 test2.py
2007-03-03  23:22                88 test3.py
2007-03-03  23:27                88 test4.py
               6 个文件        243,661 字节
               2 个目录    672,071,680 可用字节

C:\Documents and Settings\duffor\BIN>

C:\Documents and Settings\duffor\BIN>type test3.py
import popen2
a,b=popen2.popen2('cmd')
b.write('dir \n')
b.flush()
print a.read()

C:\Documents and Settings\duffor\BIN>c:\Python25\python.exe test3.py
#### 这里的不到任何输出结果
#### 程序一直在等待

为什么要w.close(),print r.read()才有输出?原来是阻塞在a.read()了。

[Copy to clipboard] [ - ]
CODE:
help(a.read)
If the size argument is negative or omitted, read until EOF is reached.

也就是如果没有收到EOF,会一直阻塞。那close的作用在于通知'cmd':交互结束了,发个EOF来吧!

所以,如果交互一直在持续,就不要w.close(),并且必须用r.read(size)收指定大小。

验证一下:

[Copy to clipboard] [ - ]
CODE:
Python 2.4.3 (#69, Mar 29 2006, 17:35:34) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> w,r = os.popen2("cmd")
>>> print r.read(43)
Microsoft Windows 2000 [Version 5.00.2195]

>>> print r.read(39)
(C) 版权所有 1985-2000 Microsoft Corp.

>>> print r.read(1)


>>> print r.read(27)
C:\Program Files\Python2.4>
>>> w.write("echo aaaa \n")
>>> w.flush()
>>> w.write("echo bbbb \n")
>>> w.flush()
>>> print r.read(4)
echo
>>> print r.read(4)
aaa
>>> print r.read(4)
a
a
>>> print r.read(4)
aaa
>>> print r.read(4)


C:
>>> print r.read(4)
\Pro
>>> print r.read(4)
gram
>>> print r.read(4)
Fil
>>> print r.read(4)
es\P
>>> print r.read(4)
ytho
>>> print r.read(4)
n2.4
>>> print r.read(4)
>ech
>>> print r.read(4)
o bb
>>> print r.read(4)
bb

>>> print r.read(4)
bbbb
>>>

所有在终端上显示的字符都会由r.read()读到。只要你预期的长度是有效的,就不会在r.read()阻塞。

另外,不知道你的exe是什么样的输出形式,建议在前面加个长度如'0010AAAAAAAAAA',0010表示这个输出有10字节,否则不知道该读多少字节就比较麻烦了。
这个不错
是需要的

还有就是如何把read的指针放到下次命令的输入处
然后读取就不会把两个命令的输出混在一起了