免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6721 | 回复: 5
打印 上一主题 下一主题

python与exe交互? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-02 21:33 |只看该作者 |倒序浏览
有一个exe程序  类似与命令行程序

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

现在用python 与其交互

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

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

根据输出结果再次 交互

直到用户退出

请问如何编写?

论坛徽章:
0
2 [报告]
发表于 2007-03-02 21:49 |只看该作者
使用exec()应该可以

论坛徽章:
0
3 [报告]
发表于 2007-03-02 22:01 |只看该作者
原帖由 xichen 于 2007-3-2 21:49 发表
使用exec()应该可以

这样的话

怎么交互输入输出

给个示范

谢谢

论坛徽章:
0
4 [报告]
发表于 2007-03-04 09:37 |只看该作者
--->
<---
表示输入命令或输出的流向



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语句就没有输出




  1. C:\Documents and Settings\duffor\BIN>type test4.py
  2. import popen2
  3. a,b=popen2.popen2('cmd')
  4. b.write('dir \n')
  5. b.close()
  6. print a.read()


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

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

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

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

  24. C:\Documents and Settings\duffor\BIN>

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

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

复制代码

[ 本帖最后由 njmarshal 于 2007-3-4 09:39 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-03-04 10:17 |只看该作者
为什么要w.close(),print r.read()才有输出?原来是阻塞在a.read()了。

  1. help(a.read)
  2. If the size argument is negative or omitted, read until EOF is reached.
复制代码

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

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

验证一下:

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

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

  9. >>> print r.read(1)


  10. >>> print r.read(27)
  11. C:\Program Files\Python2.4>
  12. >>> w.write("echo aaaa \n")
  13. >>> w.flush()
  14. >>> w.write("echo bbbb \n")
  15. >>> w.flush()
  16. >>> print r.read(4)
  17. echo
  18. >>> print r.read(4)
  19. aaa
  20. >>> print r.read(4)
  21. a
  22. a
  23. >>> print r.read(4)
  24. aaa
  25. >>> print r.read(4)


  26. C:
  27. >>> print r.read(4)
  28. \Pro
  29. >>> print r.read(4)
  30. gram
  31. >>> print r.read(4)
  32. Fil
  33. >>> print r.read(4)
  34. es\P
  35. >>> print r.read(4)
  36. ytho
  37. >>> print r.read(4)
  38. n2.4
  39. >>> print r.read(4)
  40. >ech
  41. >>> print r.read(4)
  42. o bb
  43. >>> print r.read(4)
  44. bb

  45. >>> print r.read(4)
  46. bbbb
  47. >>>
复制代码

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

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

论坛徽章:
0
6 [报告]
发表于 2007-03-04 11:25 |只看该作者
这个不错
是需要的

还有就是如何把read的指针放到下次命令的输入处
然后读取就不会把两个命令的输出混在一起了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP