22 个版本
0.3.16 | 2024 年 8 月 9 日 |
---|---|
0.3.15 | 2024 年 2 月 24 日 |
0.3.14 | 2024 年 1 月 24 日 |
0.3.13 | 2023 年 10 月 7 日 |
0.3.6 | 2022 年 3 月 5 日 |
#19 in Windows API
4,037 每月下载量
96KB
1.5K SLoC
WinPTY-rs
概述
在 Windows 的伪终端中创建和启动进程。
此包提供了一种对不同后端实现进行抽象的方法,以在 Windows 中启动 PTY 进程。目前,此库支持使用 WinPTY
和 ConPTY
。
抽象通过 [PTY
] 结构表示,它声明了用于初始化、启动、读取、写入以及获取在伪终端中运行的进程状态的各种信息的方法。
安装
为了在您的库/程序中使用 Rust,您需要将 winpty-rs
添加到您的 Cargo.toml
[dependencies]
winpty-rs = "0.3"
为了启用 winpty 兼容性,您需要在您的 PATH 中提供 winpty 可再分发二进制文件。您可以从官方 winpty 仓库版本 下载它们,或使用 Windows 中的任何已知包管理器。
使用方法
此库提供两种操作模式,一种是自动选择 PTY 后端,另一种是选择用户偏好的特定后端。
自动设置后端的 PTY 创建
use std::ffi::OsString;
use winptyrs::{PTY, PTYArgs, MouseMode, AgentConfig};
let cmd = OsString::from("c:\\windows\\system32\\cmd.exe");
let pty_args = PTYArgs {
cols: 80,
rows: 25,
mouse_mode: MouseMode::WINPTY_MOUSE_MODE_NONE,
timeout: 10000,
agent_config: AgentConfig::WINPTY_FLAG_COLOR_ESCAPES
};
// Initialize a pseudoterminal.
let mut pty = PTY::new(&pty_args).unwrap();
使用特定后端创建伪终端。
use std::ffi::OsString;
use winptyrs::{PTY, PTYArgs, MouseMode, AgentConfig, PTYBackend};
let cmd = OsString::from("c:\\windows\\system32\\cmd.exe");
let pty_args = PTYArgs {
cols: 80,
rows: 25,
mouse_mode: MouseMode::WINPTY_MOUSE_MODE_NONE,
timeout: 10000,
agent_config: AgentConfig::WINPTY_FLAG_COLOR_ESCAPES
};
// Initialize a winpty and a conpty pseudoterminal.
let winpty = PTY::new_with_backend(&pty_args, PTYBackend::WinPTY).unwrap();
let conpty = PTY::new_with_backend(&pty_args, PTYBackend::ConPTY).unwrap();
通用 PTY 操作
PTY
提供了一组操作来启动和与 PTY 内的进程通信,以及获取其状态信息。
// Spawn a process inside the pseudoterminal.
pty.spawn(cmd, None, None, None).unwrap();
// Read the spawned process standard output (non-blocking).
let output = pty.read(1000, false);
// Write to the spawned process standard input.
let to_write = OsString::from("echo \"some str\"\r\n");
let num_bytes = pty.write(to_write).unwrap();
// Change the PTY size.
pty.set_size(80, 45).unwrap();
// Know if the process running inside the PTY is alive.
let is_alive = pty.is_alive().unwrap();
// Get the process exit status (if the process has stopped).
let exit_status = pty.get_exitstatus().unwrap();
示例
请检查示例文件夹下的示例,我们提供了ConPTY和WinPTY的示例。为了编译这些示例,您可以在调用cargo build
时启用conpty_example
和winpty_example
特性。
变更日志
访问我们的变更日志文件,了解更多关于我们的新特性和改进。
贡献指南
我们使用cargo clippy
来检查这个项目的代码风格,并使用cargo test
来测试其功能。如果您有任何问题或疑问,请随时发送PR或创建一个issue。
依赖
~129MB
~2M SLoC