Python 具有多个期望的 fdpexpect

Python fdpexpect with multiple expects

测试应该执行外部应用程序并在那里捕获两个输入的简单示例。

# external_application.py
print('First_line:')
x = input()

print('Second_line:')
y = input()

print(f'Done: {x} and {y}')

亚军:

# runner.py
import subprocess
import pexpect.fdpexpect

p = subprocess.Popen(("python", "external_application.py"), stdin=subprocess.PIPE, stdout=subprocess.PIPE)

session = pexpect.fdpexpect.fdspawn(p.stdout.fileno())

session.expect("First_line:")
p.stdin.write(b'1')
print('first_done')

session.expect("Second_line:")
p.stdin.write(b'2')
print('second_done')

p.stdin.close()
print(f'Result: {p.stdout.read()}')

我可以看到 print('first_done') 的输出,然后锁定在第二个 expect。如果我们删除第二个 input 和第二个 expect 那么一切正常直到最后。
运行 windows、python 3.7.9,预计 4.8.0
我错过了一些超时或同花顺吗?

当我检查转储时,session 匹配 b'First_line:\r\n',但 p.stdin.write 不会将预期光标向前移动以查找 "Second_line:",因为send()sendline().

我可以建议一个更简单的方法,使用 PopenSpawn 吗?文档声明它“使用subprocess.Popen提供了一个类似于pexpect.spawn接口(原文如此)的接口”:

注意 - 在 Windows 11 中测试,使用 Python 3.9.

import pexpect
from pexpect import popen_spawn

session = pexpect.popen_spawn.PopenSpawn("python external_application.py")
session.expect("First_line:")
session.sendline("1")
print("first_done")

session.expect("Second_line:")
session.sendline("2")
print("second_done")

print(session.read().decode("utf-8"))

输出:

first_done
second_done

Done: 1 and 2