# os 多种操作系统接口

2023年8月04日7分钟阅读

- FormalSciences/ComputerScience
- ProgrammingLanguage/Python
- Python/Libraires

## 概述

**`os` 模块的主要目的之一就是提供一个跨平台的接口来与操作系统进行交互。**通过这个抽象层，开发者可以编写在多种操作系统上都能运行的代码，而无需关心底层操作系统的具体实现细节。

这样做有几个主要优点：

1. 可移植性：代码可以在不同的操作系统上运行，无需进行大量的修改。
2. 维护性：由于操作系统特定的实现细节被抽象出来，维护代码变得更容易。
3. 可读性和可理解性：提供了一组统一的 API，使得代码更容易阅读和理解。
4. 开发效率：开发者可以更快地开发应用程序，因为他们不需要了解所有操作系统的内部工作机制。

然而，也有一些局限性和挑战：

1. 性能：抽象层可能会引入一些额外的性能开销。
2. 功能限制：为了保持跨平台性，`os` 模块可能不会提供某个特定操作系统上可用的高级功能。
3. 平台特定的代码：虽然 `os` 模块尽量提供跨平台的方法，但有时还是需要编写一些平台特定的代码。

总体来说，`os` 模块确实旨在消除操作系统之间的不一致性，并提供一个更加统一和高级的编程接口。

## 导入

    import os

## 进程管理

方法 | 描述 | 平台适用性
--- | --- | ---
`os.fork()` | 创建一个子进程 | UNIX/Linux
`os.exec*()` | 在当前进程中执行新程序 | 所有（但在 Windows 上有限制）
`os.spawn*()` | 创建新进程运行程序 | 所有（但在 UNIX/Linux 上不常用）
`os.wait()` | 等待子进程完成 | UNIX/Linux
`os.waitpid(pid, options)` | 等待特定的子进程完成 | UNIX/Linux
`os.kill(pid, signal)` | 向进程发送信号 | UNIX/Linux
`os.terminate()` | 终止当前进程 | Windows
`os.startfile(filepath)` | 使用关联的应用程序打开文件 | Windows

## 文件管理

方法 | 描述 | 平台适用性
--- | --- | ---
`os.open(file, flags[, mode])` | 打开文件，并返回文件描述符 | 所有
`os.close(fd)` | 关闭文件描述符 | 所有
`os.read(fd, n)` | 从文件描述符 `fd` 读取最多 `n` 个字节 | 所有
`os.write(fd, str)` | 写入字符串到文件描述符 `fd` | 所有
`os.remove(path)` | 删除指定的文件 | 所有
`os.rename(src, dst)` | 重命名文件或目录 | 所有
`os.stat(path)` | 获取文件或目录的状态信息 | 所有
`os.chmod(path, mode)` | 改变文件或目录的权限 | 所有
`os.chown(path, uid, gid)` | 改变文件或目录的所有者和所属组 | UNIX/Linux
`os.utime(path, times)` | 更新文件时间戳 | 所有
`os.path.getsize(path)` | 获取文件的大小 | 所有
`os.path.getmtime(path)` | 获取文件的最后修改时间 | 所有
`os.path.getctime(path)` | 获取文件的创建时间 | 所有
`os.path.isfile(path)` | 检查指定路径是否是文件 | 所有
`os.path.isdir(path)` | 检查指定路径是否是目录 | 所有
`os.path.exists(path)` | 检查指定路径是否存在 | 所有
`os.path.split(path)` | 将路径分割为目录和文件名 | 所有
`os.path.splitext(path)` | 将文件路径分割为文件名和扩展名 | 所有
`os.path.join(a, b)` | 将多个路径组合成一个路径 | 所有

## 目录操作

方法 | 描述 | 平台适用性
--- | --- | ---
`os.getcwd()` | 获取当前工作目录 | 所有
`os.chdir(path)` | 改变当前工作目录 | 所有
`os.mkdir(path)` | 创建新目录 | 所有
`os.makedirs(path)` | 创建新目录，如果父目录不存在也会被创建 | 所有
`os.rmdir(path)` | 删除目录 | 所有
`os.removedirs(path)` | 删除目录，如果目录内有文件也会被删除 | 所有
`os.listdir(path)` | 列出指定目录下的所有文件和目录 | 所有
`os.scandir(path)` | 返回一个迭代器，包含目录中的 `DirEntry` 对象 | 所有
`os.rename(old, new)` | 重命名目录 | 所有
`os.stat(path)` | 获取目录的状态信息 | 所有
`os.chmod(path, mode)` | 改变目录的权限 | 所有
`os.chown(path, uid, gid)` | 改变目录的所有者和所属组 | UNIX/Linux
`os.path.isdir(path)` | 检查指定路径是否是目录 | 所有
`os.path.exists(path)` | 检查指定路径是否存在 | 所有
`os.path.split(path)` | 将路径分割为目录和文件名 | 所有
`os.path.join(a, b)` | 将多个路径组合成一个路径 | 所有

## 系统信息

方法 | 描述 | 平台适用性
--- | --- | ---
`os.name` | 获取操作系统名字（如 `'posix'`, `'nt'`） | 所有
`os.uname()` | 获取详细的系统信息（仅 UNIX/Linux） | UNIX/Linux
`os.environ` | 获取环境变量 | 所有
`os.getenv(key)` | 获取特定环境变量的值 | 所有
`os.putenv(key, value)` | 设置环境变量的值 | 所有
`os.system(command)` | 运行外部命令 | 所有
`os.cpu_count()` | 获取 CPU 核心数量 | 所有
`os.getpid()` | 获取当前进程 ID | 所有
`os.getppid()` | 获取父进程 ID | 所有
`os.getuid()` | 获取当前用户 ID（仅 UNIX/Linux） | UNIX/Linux
`os.getgid()` | 获取当前组 ID（仅 UNIX/Linux） | UNIX/Linux
`os.getlogin()` | 获取当前用户登录名 | UNIX/Linux, Windows
`os.urandom(n)` | 生成 `n` 个字节的强随机数 | 所有

## 文件描述符操作

方法 | 描述 | 平台适用性
--- | --- | ---
`os.dup(fd)` | 复制文件描述符 | 所有
`os.dup2(fd, fd2)` | 复制文件描述符到另一个文件描述符 | 所有
`os.fdopen(fd[, mode[, bufsize]])` | 通过文件描述符打开文件对象 | 所有

## 信号处理

方法 | 描述 | 平台适用性
--- | --- | ---
`os.kill(pid, sig)` | 向进程发送信号 | UNIX/Linux
`os.signal(signalnum, handler)` | 设置信号处理程序 | UNIX/Linux

## 终端管理

方法 | 描述 | 平台适用性
--- | --- | ---
`os.isatty(fd)` | 检查文件描述符是否连接到终端 | 所有
`os.ttyname(fd)` | 获取与文件描述符关联的终端名称 | UNIX/Linux

## 其他

方法 | 描述 | 平台适用性
--- | --- | ---
`os.popen(command[, mode[, bufsize]])` | 打开与一个进程的管道 | 所有
`os.pipe()` | 创建一个管道 | 所有
`os.tempnam([dir[, prefix]])` | 生成一个唯一的临时文件名（不推荐，使用 `tempfile` 模块代替） | 所有
`os.tmpfile()` | 创建并打开（‘w+b’）一个新的临时文件（不推荐，使用 `tempfile` 模块代替） | UNIX/Linux