gpt4 book ai didi

python - 为什么 ANSI 转义码有时可以在 CMD 中工作

转载 作者:行者123 更新时间:2023-12-03 11:34:04 25 4
gpt4 key购买 nike

ANSI 转义码默认在 cmd 中不起作用。

但是,某些应用程序会进行某种初始化,然后它们似乎在该 session 期间可以工作。

他们如何进行初始化?这是一个例子 -

我构建了一个简单的 Rust 应用程序,它使用 ANSI 代码进行彩色输出。

Image showing cargo using ANSI escape codes.

但是,如果我首先构建项目,然后关闭该 session ,然后再次启动 cmd 进入我编译的项目所在的目录,然后运行可执行文件(这次在此 session 中根本不使用 cargo )-

ANSI escape codes without cargo

似乎像 Cargo 这样的应用程序(以及其他应用程序)在 cmd 中执行某种初始化步骤,之后终端似乎可以识别 ANSI 代码。

还有Python调用os.system('')在使用 ANSIescape 代码之前完成这项工作 -

ANSI escape codes work after os.system('')

看起来像os.system('')是一个错误,你不应该依赖错误来使你的代码工作。有没有更好的方法在cmd中初始化ANSI转义码?

最佳答案

您正在搜索的是ENABLE_VIRTUAL_TERMINAL_PROCESSING 。它有时“停止工作”的原因是因为某些应用程序在退出之前禁用它。如果它已经启用,那么这就是东西坏掉的时候。

但是,您可以通过调用 SetConsoleMode() 轻松启用它(再次)使用winapi crate 。您还可以使用winapi-util crate这使它变得更容易一些。

#[cfg(windows)]
pub fn enable_virtual_terminal_processing() {
use winapi_util::console::Console;

if let Ok(mut term) = Console::stdout() {
let _ = term.set_virtual_terminal_processing(true);
}
if let Ok(mut term) = Console::stderr() {
let _ = term.set_virtual_terminal_processing(true);
}
}
[target.'cfg(windows)'.dependencies]
winapi-util = "0.1"

为了安全,您可以首先在main()中调用enable_virtual_terminal_processing()。但是,我绝对建议在执行 std::process::Command 后调用它,例如:

let output = Command::new("...")
.args(&["..."])
.output()
.expect("failed to execute process");

#[cfg(windows)]
enable_virtual_terminal_processing();

关于python - 为什么 ANSI 转义码有时可以在 CMD 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63526130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com