【问题标题】:Popen and stdin to automate input to .exePopen 和 stdin 自动输入 .exe
【发布时间】:2014-11-13 14:04:27
【问题描述】:

我有一个简单的 Windows 可执行文件,它要求用户输入,我正在尝试制作一个 python 脚本来自动输入。 我做了什么:

from subprocess import Popen, PIPE
p = Popen([r'myprgm.exe'], stdin=PIPE)
p.communicate(input=bytes(input("Test Input"), 'UTF-8'))

现在,通常当程序运行时,它会输出到命令提示符“给我输入:”然后等待用户输入。

如果我将 Popen 与 stdin=PIPE 选项一起使用,则根本不会将任何内容写入命令提示符 - 它只是空白。

然后,当我使用通信时,“测试输入”最终出现在 python 控制台上,而不是进程上。

是否可以自动化这样的事情?还是我在这里遗漏了一些基本的东西..

【问题讨论】:

  • 您必须在调用communicate之前提供输入

标签: python stdin popen


【解决方案1】:

“测试输入”最终出现在 python 控制台上

您会看到输出,因为input(prompt) function 打印了它。如果您想将Test Input 逐字传递给子进程,请删除input() 调用:

#!/usr/bin/env python
from subprocess import Popen, PIPE

p = Popen('myprgm.exe', stdin=PIPE)
p.communicate(input=b"Test Input")

不保证myprgm.exe 在 Windows 上接受 utf-8 输入(它可能会接受使用 Windows 控制台 OEM 编码,例如 cp437 或 Windows ANSI 编码,例如 cp1252 编码的输入),因此bytes(unicode_string, 'utf-8')输入可能有误。应该可以传递带有 ascii 范围内字节的字节串(使用 b'' 字节文字创建)。

【讨论】:

    【解决方案2】:

    您可以将input 赋予communicate 函数。

    喜欢

    p1 = Popen(["mycmd"], stdin=PIPE, stdout=PIPE)
    output = p1.communicate(input="my input")[0]
    

    【讨论】:

    • 你还需要 stdin=PIPE。
    • 抱歉复制粘贴错误:)
    • OP 使用 Python 3,除非启用文本模式,否则您必须将 bytes 作为 input 值传递。
    猜你喜欢
    • 2020-05-11
    • 2015-11-24
    • 2017-12-22
    • 2019-02-13
    • 1970-01-01
    • 2013-07-12
    • 2012-04-24
    • 2013-06-04
    • 2017-05-21
    相关资源
    最近更新 更多