我有一个 C# 应用程序,在通过命令行终端执行或手动执行时运行得非常好。当使用 python 脚本运行 C# 应用程序时,程序会抛出以下错误:
Unhandled Exception: System.InvalidOperationException: Cannot read keys when either application does not have a console or when console input has been redirected from a file. Try Console.Read. at System.Console.ReadKey(Boolean intercept)
在 python 中使用 subprocess.Popen 运行时程序无法读取密钥是否有原因?
p = subprocess.Popen(
f"SomeCSharpProgram.exe",
stdin=PIPE,
stdout=PIPE,
stderr=PIPE,
shell=True
)
output, error = p.communicate(input=b'\n')
Console.ReadKey
在后台调用需要标准控制台句柄的 API 入口点。只要您的程序直接在标准控制台中运行(由 cmd.exe
启动或直接运行),此操作就有效。
在这种情况下,您使用的是
Popen
,它在各种标准流(stdin、stdout、stderr)上使用重定向。在这种情况下,没有与实际控制台的连接,因此依赖于控制台直接工作的任何内容(例如Console.ReadKey
)将不再起作用。
所有这些都隐含在您的错误消息中:
当任一应用程序没有控制台或控制台输入已从文件重定向时,无法读取按键。
(为了完整性,它应该包括“或其他流”。)
您可以使用
os.system(...)
来运行您的程序来解决这个问题。我读到的所有内容似乎都表明默认情况下它使用正确的控制台交互,但关于 Windows 的信息并不多。