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
测试应该执行外部应用程序并在那里捕获两个输入的简单示例。
# 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