【问题标题】:Multiple stdin.write usage with pythonpython的多个stdin.write用法
【发布时间】:2012-08-23 08:40:25
【问题描述】:

我有一个 Visual Studio 应用程序,它接受像

这样的交互式参数
- PATH 

在输入时,显示 MENU #1(它再次接受参数/用户输入),再次在输入时,显示 MENU #2。

我需要从 Python 调用这个 VS 应用程序 (exe)。我有限制坚持使用 Python 2.5 版本。

我尝试使用 subprocess.popen 和 stdin.write。

我能够通过 MENU#1 进行解析,但无法继续执行 MENU #2,依此类推...

关于实现上述目标的任何提示/示例?

我的代码如下:

p = subprocess.Popen('app.exe',stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=None)
p.stdin.write(file_path)  # for menu 1

time.sleep(0.5)

p.stdin.write('0')         # for menu 2..

...

o,e = p.communicate()

【问题讨论】:

  • 您确定 exe 是从标准输入读取的,而不是直接从控制台读取的吗?
  • 不太确定。珍妮。我认为 exe 从 stdin 读取(因为如果我删除 p.stdin.write('0') 观察到的行为符合预期。)

标签: python windows subprocess python-2.5


【解决方案1】:

请改用pexpect module;它可以让你通过交互输入控制程序,比子进程模块更好。

import pexpect

p = pexpect.spawn('app.exe')
p.sendline(file_path)
p.expect('Menu #2:.*')
p.sendline('0')

对于 Windows,您可以改用 wexpect.py,这是 pexpect 模块到 Windows 控制台的端口。

【讨论】:

  • 亲爱的 Martijn, 非常感谢您的建议。但我认为 pexpect 模块适用于 Linux 环境。目前我已经安装在 Windows 7 / XP 环境中运行。
  • 你试过了吗?这是一个纯python模块,所以不会有任何编译问题。
  • 亲爱的 Martijn,是的,我试过了。>>> 导入 pexpect Traceback(最近一次调用最后一次):文件“”,第 1 行,在 文件“D:\Python25\ Lib\site-packages\pexpect.py",第 85 行,在 中支持它。 Pexpect 适用于类 UNIX 操作系统。""") ImportError: No module named resource 未找到关键模块。可能此操作系统不支持它。Pexpect 适用于类 UNIX 操作系统。>>>
  • 啊,文档说明它可以在 Cygwin 环境中工作,而不仅仅是在 Windows 上。对此感到抱歉。
猜你喜欢
  • 2016-01-23
  • 2015-07-19
  • 1970-01-01
  • 1970-01-01
  • 2020-05-06
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多