器→工具, 编程语言

Python标准库之操作系统接口

钱魏Way · · 54 次浏览

OS:操作系统接口

os 模块是 Python 标准库中的一个核心模块,提供了与操作系统进行交互的功能。它允许 Python 程序执行操作系统级别的任务,例如文件和目录操作、环境变量管理、进程管理等。os 模块的功能因操作系统而异,但它为跨平台编程提供了统一的接口。os 模块提供了与操作系统交互的强大功能,是进行系统级编程和文件操作的重要工具。它帮助开发者实现跨平台兼容的应用程序,并处理各种操作系统级别的任务。

主要功能

  • 文件和目录操作:创建、删除、重命名、移动文件和目录。
  • 路径操作:处理路径名和文件名。
  • 环境变量:访问和修改环境变量。
  • 进程管理:创建和管理进程,执行系统命令。
  • 权限和所有权:管理文件和目录的权限和所有权。

注意事项

  • 平台差异:某些 os 模块功能在不同的操作系统上可能有所不同。例如,system 在 Windows 和 Unix 系统上表现不同。
  • 权限问题:更改文件权限和所有权可能需要管理员权限,特别是在受限环境下。
  • 安全性:在执行系统命令时,请注意输入数据的安全性,以防止命令注入攻击。

文件和目录操作

  • mkdir(path, mode=0o777):创建目录。path:要创建的目录路径。mode:可选参数,指定目录的权限。默认为 0o777(即所有权限)。
  • rmdir(path):删除空目录。path:要删除的目录路径。
  • remove(path):删除文件。path:要删除的文件路径。
  • rename(src, dst):重命名文件或目录。src:原路径。dst:新路径。
  • path.join(*paths) :将多个路径组合成一个路径。*paths:要组合的路径。

示例:

import os

os.mkdir('new_directory')
os.rmdir('new_directory')
os.remove('file_to_delete.txt')
os.rename('old_name.txt', 'new_name.txt')

path = os.path.join('folder', 'subfolder', 'file.txt')
print(path)  # 输出:folder/subfolder/file.txt

路径操作

  • path.abspath(path):返回路径的绝对路径。path:要转换的路径。
  • path.exists(path):功能:检查路径是否存在。path:要检查的路径。如果路径存在,则返回 True;否则返回 False。
  • path.isfile(path):检查路径是否是文件。path:要检查的路径。如果路径是文件,则返回 True;否则返回 False。
  • path.isdir(path):检查路径是否是目录。要检查的路径。如果路径是目录,则返回 True;否则返回 False。

示例:

import os

abs_path = os.path.abspath('file.txt')

exists = os.path.exists('file.txt')
print(exists)

is_file = os.path.isfile('file.txt')
print(is_file)

is_dir = os.path.isdir('directory')
print(is_dir)

环境变量

  • getenv(key, default=None):获取环境变量的值。key:环境变量的名称。default:可选参数,如果环境变量不存在,则返回默认值。
  • putenv(key, value):设置环境变量的值。key:环境变量的名称。value:环境变量的值。在某些平台上,os.putenv 不一定能持久化环境变量的更改。

示例:

import os

home_dir = os.getenv('HOME')
print(home_dir)

os.putenv('MY_ENV_VAR', 'value')

进程管理

  • system(command):执行系统命令。command:要执行的命令。
  • execvp(program, arguments):替换当前进程映像为新程序。program:要执行的程序名称。arguments:要传递给程序的参数列表。此函数不返回,成功执行后当前进程映像将被替换。
  • getpid():获取当前进程的进程 ID。
  • kill(pid, sig):向指定的进程发送信号。pid:要发送信号的进程 ID。sig:要发送的信号。

示例:

import os

os.system('echo Hello World')
os.execvp('ls', ['ls', '-l'])

pid = os.getpid()
print(pid)

import signal
os.kill(os.getpid(), signal.SIGTERM)  # 向当前进程发送终止信号

权限和所有权

  • chmod(path, mode):更改文件或目录的权限。path:文件或目录的路径。mode:新的权限模式(如 0o777)。
  • chown(path, uid, gid):更改文件或目录的所有权。path:文件或目录的路径。uid:新的用户 ID。gid:新的组 ID。

示例:

import os

os.chmod('file.txt', 0o755)
os.chown('file.txt', 1000, 1000)  # 将文件的所有权更改为指定的用户和组

errno:标准 errno 系统符号

errno 模块是 Python 标准库中的一个模块,提供了一组用于处理操作系统错误代码的常量。这些错误代码通常用于表示系统调用或库函数执行时的错误类型。在 Python 中,errno 模块主要用于与底层系统调用和文件操作相关的错误处理。errno 模块是一个重要的工具,用于处理与系统调用和文件操作相关的错误。它提供了一个标准的方式来识别和处理这些错误,使得错误处理更加一致和可靠。

使用场景

  • 错误处理:在处理文件操作、系统调用或与操作系统交互时,使用 errno 模块来识别和处理错误条件。
  • 调试:在调试程序时,根据 errno 常量来诊断错误原因。
  • 兼容性:编写与底层系统调用和文件操作兼容的跨平台代码。

注意事项

  • 平台差异:不同的操作系统可能有不同的错误代码和错误含义。errno 常量在不同平台上可能有所不同,但 Python 通过标准化错误代码来提供一致的接口。
  • 异常处理:在异常处理时,通常可以通过捕获 OSError 并检查其 errno 属性来处理错误。

主要常量

errno 模块中的常量是系统级错误代码的符号名称,通常是整数值,用于表示特定的错误条件。以下是一些常用的错误代码常量:

错误码 功能
errno.ENOENT “No such file or directory”(没有这样的文件或目录) 2
errno.EACCES “Permission denied”(权限被拒绝) 13
errno.EEXIST “File exists”(文件已存在) 17
errno.EINVAL “Invalid argument”(无效的参数) 22
errno.ENOSPC “No space left on device”(设备上没有剩余空间) 28
errno.EIO “Input/output error”(输入/输出错误) 5
errno.ETIMEDOUT “Connection timed out”(连接超时) 110

以下是一些示例,演示如何在 Python 程序中使用 errno 模块来处理不同的错误情况。

示例 1: 使用 errno 处理文件操作错误

import errno
import os

try:
    # 尝试打开一个不存在的文件
    with open('non_existent_file.txt', 'r') as file:
        content = file.read()
except OSError as e:
    if e.errno == errno.ENOENT:
        print("Error: The file does not exist.")
    elif e.errno == errno.EACCES:
        print("Error: Permission denied.")
    else:
        print("Error: An unexpected error occurred.")

示例 2: 使用 errno 在自定义异常中

import errno

class CustomFileError(Exception):
    def __init__(self, errno_code):
        self.errno_code = errno_code
        super().__init__(self._get_error_message())

    def _get_error_message(self):
        if self.errno_code == errno.EACCES:
            return "Permission denied."
        elif self.errno_code == errno.ENOENT:
            return "File not found."
        else:
            return "An unknown error occurred."

try:
    # 触发一个自定义异常
    raise CustomFileError(errno.EACCES)
except CustomFileError as e:
    print(f"Custom File Error: {e}")

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注