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

Coo*_*per 2 python cmd ansi-escape rust rust-cargo

默认情况下,ANSI 转义码在 cmd 中不起作用。

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

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

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

显示使用 ANSI 转义码的货物的图像。

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

无货物的 ANSI 转义码

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

并且在os.system('')使用 ANSIescape 代码之前的 Python 调用中也可以完成这项工作 -

ANSI 转义码在 os.system('') 之后工作

这似乎os.system('')是一个错误,并且您不应该依赖错误来使代码正常工作。有没有更好的方法在cmd中初始化ANSI转义码?

Val*_*tin 5

您正在寻找的是ENABLE_VIRTUAL_TERMINAL_PROCESSING. 它有时“停止工作”的原因是因为某些应用程序在退出之前禁用它。如果它已经启用,那么这就是事情发生的时候。

但是,您可以通过SetConsoleMode()使用winapicrate调用来轻松启用它(再次) 。您也可以使用winapi-util板条箱,这样会更容易一些。

#[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);
    }
}
Run Code Online (Sandbox Code Playgroud)
[target.'cfg(windows)'.dependencies]
winapi-util = "0.1"
Run Code Online (Sandbox Code Playgroud)

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

[target.'cfg(windows)'.dependencies]
winapi-util = "0.1"
Run Code Online (Sandbox Code Playgroud)