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

Download history 997/week @ 2024-05-04 1103/week @ 2024-05-11 1248/week @ 2024-05-18 1036/week @ 2024-05-25 1052/week @ 2024-06-01 989/week @ 2024-06-08 968/week @ 2024-06-15 1036/week @ 2024-06-22 1217/week @ 2024-06-29 937/week @ 2024-07-06 957/week @ 2024-07-13 1115/week @ 2024-07-20 958/week @ 2024-07-27 1096/week @ 2024-08-03 1129/week @ 2024-08-10 707/week @ 2024-08-17

4,037 每月下载量

MIT/Apache

96KB
1.5K SLoC

WinPTY-rs

Package licenses Crates.io Crates.io (recent) docs.rs Library tests codecov

概述

在 Windows 的伪终端中创建和启动进程。

此包提供了一种对不同后端实现进行抽象的方法,以在 Windows 中启动 PTY 进程。目前,此库支持使用 WinPTYConPTY

抽象通过 [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_examplewinpty_example特性。

变更日志

访问我们的变更日志文件,了解更多关于我们的新特性和改进。

贡献指南

我们使用cargo clippy来检查这个项目的代码风格,并使用cargo test来测试其功能。如果您有任何问题或疑问,请随时发送PR或创建一个issue。

依赖

~129MB
~2M SLoC