当 Python 作为子进程运行时,C# 程序无法 ReadKey

问题描述 投票:0回答:1

我有一个 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')
python c# subprocess
1个回答
0
投票

Console.ReadKey
在后台调用需要标准控制台句柄的 API 入口点。只要您的程序直接在标准控制台中运行(由
cmd.exe
启动或直接运行),此操作就有效。

在这种情况下,您使用的是

Popen
,它在各种标准流(stdin、stdout、stderr)上使用重定向。在这种情况下,没有与实际控制台的连接,因此依赖于控制台直接工作的任何内容(例如
Console.ReadKey
)将不再起作用。

所有这些都隐含在您的错误消息中:

当任一应用程序没有控制台或控制台输入已从文件重定向时,无法读取按键。

(为了完整性,它应该包括“或其他流”。)

您可以使用

os.system(...)
来运行您的程序来解决这个问题。我读到的所有内容似乎都表明默认情况下它使用正确的控制台交互,但关于 Windows 的信息并不多。

© www.soinside.com 2019 - 2024. All rights reserved.