首页 > 编程语言 >Python模块百科_操作系统接口_os[四]

Python模块百科_操作系统接口_os[四]

时间:2024-03-17 18:05:11浏览次数:26  
标签:文件 Python 百科 描述符 fd 进程 os ID

Python模块百科_操作系统接口_os[四]

os — 多种操作系统接口

源代码: Lib/os.py


  os 模块提供了与操作系统交互的多种功能。可以使用 os 模块来执行文件或目录操作,如读取或修改环境变量、访问命令行参数、处理文件路径、执行系统命令等。

【第一部分】


一、相关模块

1.1 os.path 文件路径

1.2 fileinput 文件读取

1.3 tempfile 临时文件和目录

1.4 shutil 高级文件和目录

1.5 platform 操作系统底层模块

二、关于函数适用性的说明

2.1 与操作系统相同的接口

2.2 支持字节串和字符串

2.3 exception OSError

三、文件名,命令行参数,以及环境变量

四、文件系统编码格式与错误处理句柄

五、locale encoding – 语言区域编码格式

六、Python UTF-8 模式

【第二部分】


七、进程参数

os模块中,下列函数和数据、类等提供了操作当前进程和用户的信息。

7.1 os.ctermid()

7.2 os.environ

7.4 os.fchdir(fd)

7.5 os.getcwd()

7.6 os.fsencode(filename)

7.7 os.fsdecode(filename)

【第三部分】


7.8 os.fspath(path)

7.9 class os.PathLike

7.10 os.getenv(key, default=None)

7.11 os.get_exec_path(env=None)

7.12 os.putenv(key, value, /)

7.13 os.strerror(code, /)

7.14 os.uname()

【第四部分】


7.15 os.getlogin()

os.getlogin() 函数用于获取当前用户的登录名。这个函数通常用于确定当前正在运行脚本的用户是谁。

下面是一个简单的示例:

import os

# 获取当前用户的登录名
username = os.getlogin()

# 打印登录名
print(f"当前用户的登录名是: {username}")

这段代码输出当前用户的登录名。os.getlogin() 的行为可能因操作系统而异,并且在某些情况下可能无法获取到登录名。

在Windows上,os.getlogin() 通常返回当前用户的用户名。在Unix-like系统上(如Linux和macOS),如果Python脚本以超级用户(root)身份运行,os.getlogin() 可能会返回None,因为root用户通常没有登录名。在这种情况下,可以使用 os.getpwuid(os.geteuid()).pw_name 来获取当前有效用户的用户名。

在类Unix系统上获取有效用户名的示例:

import os

# 尝试获取登录名
username = os.getlogin()

# 如果在Unix-like系统上作为root用户运行并且登录名为None,则获取有效用户名
if username is None:
    username = os.getpwuid(os.geteuid()).pw_name

# 打印用户名
print(f"当前用户的用户名是: {username}")

注意:使用 os.getpwuid() 函数时,请确保的程序有足够的权限来访问用户密码数据库,否则可能会引发 KeyError 异常。

7.16 os.getpgid(pid)

os.getpid() 用于获取当前进程的进程ID(Process ID)。进程ID是一个非负整数,它唯一地标识了操作系统中的一个进程。

下面是一个简单的示例:

import os

# 获取当前进程的进程ID
process_id = os.getpid()

# 打印进程ID
print(f"当前进程的进程ID是: {process_id}")

这段代码输出当前Python脚本所在进程的进程ID。这个ID在操作系统中是唯一的,并且可以在进程管理工具、系统监视器等中看到。

了解进程的ID在很多场景下都是很有用,比如:

  • 调试和日志记录:当需要跟踪某个特定进程的行为时,进程ID可以帮助快速定位它。
  • 进程间通信:如果正在编写需要与其他进程交互的代码,知道的进程的ID可以简化通信过程。
  • 系统管理:系统管理工具和脚本通常需要进程ID来启动、停止、管理进程。

os.getpid() 是一个非常基础和常用的函数,因为它提供了一种直接获取当前进程身份的方式。

在操作系统编程和高级脚本中,这个信息经常被使用。

7.17 os.getppid()

os.getppid() 用于获取当前进程的父进程的进程ID(Parent Process ID)。父进程是创建当前进程的进程。

下面是一个简单的示例:

import os

# 获取当前进程的父进程的进程ID
parent_process_id = os.getppid()

# 打印父进程ID
print(f"当前进程的父进程ID是: {parent_process_id}")

这段代码输出当前Python脚本所在进程的父进程的进程ID。这个ID同样是操作系统中的一个唯一标识符,可以用来在进程管理工具中跟踪和管理父进程。

os.getppid() 在多进程编程中特别有用,因为它允许了解哪些进程是相互关联的。在某些场景下,比如守护进程、监控子进程的脚本中,了解父进程ID可能非常关键。

注意:

  • 当父进程已经结束,但在子进程中仍然调用 os.getppid() 时,不同的操作系统可能会有不同的行为。

  • 在 Unix 系统中,如果父进程已经结束,os.getppid() 通常会返回 1,这是 init 进程(也被称为 PID 1)的进程ID,它是所有孤儿进程的默认父进程。

  • 在 Windows 系统中,os.getppid() 可能会返回与当前进程相同的进程ID,或者是一个系统保留的进程ID。

八、创建文件对象

这些函数创建新的 file objects 。(参见 open() 以获取打开文件描述符的相关信息。)

8.1 os.fdopen(fd, **args, ***kwargs)

返回打开文件描述符 fd 对应文件的对象。类似内建 open() 函数,二者接受同样的参数。不同之处在于 fdopen() 第一个参数应该为整数。

os.fdopen()允许通过文件描述符(file descriptor)来打开一个文件,并返回一个标准的文件对象。

文件描述符是一个小整数,通常是由底层的操作系统函数如 open()socket.accept() 返回的。文件描述符在底层操作系统中用于表示打开的文件、套接字或其他输入/输出资源。

在 Python 中,通常不需要直接与文件描述符打交道,因为 Python 的文件对象提供了更加高级和易用的接口。但是,在某些特定场景下,例如处理来自系统调用或第三方库的文件描述符时,os.fdopen() 就变得非常有用。

**简单示例:**使用 os.fdopen() 打开一个通过底层 os.open() 函数打开的文件描述符

import os

# 使用 os.open 打开一个文件,并获取文件描述符
fd = os.open('example.txt', os.O_CREAT | os.O_WRONLY)

# 使用 os.fdopen 将文件描述符转换为文件对象
file_obj = os.fdopen(fd, 'w')

# 通过文件对象写入内容
file_obj.write('Hello, world!')

# 关闭文件对象,也可以通过文件描述符直接关闭,二选一
file_obj.close()
os.close(fd)

在上面的例子中,os.open() 用于打开文件并返回一个文件描述符,然后 os.fdopen() 用于将这个文件描述符转换成一个标准的文件对象,这样就可以使用 Python 的文件对象方法(如 write()close())来操作文件了。

注意:

  • 当使用 os.fdopen() 打开一个文件描述符后,该描述符就被新的文件对象所拥有。如果想再次使用这个描述符,需要重新打开文件或获取一个新的描述符。

  • 当关闭文件对象时,其底层的文件描述符也会被关闭。如果已经通过 os.fdopen() 获取了文件对象,并再次使用 os.close() 关闭了底层的文件描述符,那么当尝试通过文件对象进行写操作或再次关闭时,可能会遇到错误,因为文件描述符已经被关闭了。

九、文件描述符操作

对文件描述符所引用的 I/O 流进行操作。

文件描述符是一些小的整数,对应于当前进程所打开的文件。例如,标准输入的文件描述符通常是0,标准输出是1,标准错误是2。之后被进程打开的文件的文件描述符会被依次指定为3,4,5等。

当需要时,可以用 fileno() 可以获得 file object 所对应的文件描述符。需要注意的是,直接使用文件描述符会绕过文件对象的方法,会忽略如数据内部缓冲等情况。

9.1 os.close(fd)

os.close(fd) 用于关闭由文件描述符 fd 指定的文件。文件描述符是一个小整数,通常是由底层的操作系统函数如 os.open()socket.accept() 返回的。关闭文件描述符是一个重要的步骤,因为它会释放系统资源,并确保所有的数据都被正确地写入到了文件中。

当使用 os.open() 或类似的底层函数打开一个文件时,就有责任在某个时刻关闭这个文件。如果不关闭文件,可能会导致资源泄露,因为操作系统会为每个打开的文件描述符分配内存和其他资源。当这些资源耗尽时,的程序或其他程序可能无法再打开文件或执行其他 I/O 操作。

在 Python 中,更常见的是使用 open() 函数来打开文件,因为它会在完成文件操作后自动关闭文件,即使在发生异常的情况下也是如此。但是,当使用底层函数或需要更精细的文件控制时,可能需要手动关闭文件描述符。

**简单示例:**使用 os.open() 打开一个文件,然后使用 os.close() 关闭它

import os

# 使用 os.open 打开一个文件,并获取文件描述符
fd = os.open('example.txt', os.O_CREAT | os.O_WRONLY)

try:
    # 通过文件描述符写入内容
    os.write(fd, b'Hello, world!')
finally:
    # 确保文件描述符被关闭,无论是否发生异常
    os.close(fd)

注意:

  • os.close() 只关闭文件描述符,而不会关闭任何通过 os.fdopen() 创建的文件对象。如果使用了 os.fdopen() 创建了文件对象,应该调用该文件对象的 close() 方法来关闭它,这同时也会关闭底层的文件描述符。

9.2 os.closerange(fd_low, fd_high, /)

os.closerange(fd_low, fd_high) 用于关闭从 fd_lowfd_high(包含两端)之间的所有文件描述符。这个函数非常有用,当需要关闭一系列连续的文件描述符时,可以避免逐个调用 os.close()

使用 os.closerange() 可以减少代码量,提高效率,尤其是在处理大量文件描述符时。这个函数会关闭指定范围内的所有文件描述符,即使其中一些文件描述符之前已经被关闭也不会出错。

**简单示例:**如何使用 os.closerange()

import os

# 假设我们有一些文件描述符
fd1 = os.open('file1.txt', os.O_CREAT | os.O_WRONLY)
fd2 = os.open('file2.txt', os.O_CREAT | os.O_WRONLY)
fd3 = os.open('file3.txt', os.O_CREAT | os.O_WRONLY)

# 假设我们有一个文件描述符的范围,从 fd1 到 fd3
low = fd1
high = fd3

try:
    # ... 这里可以执行一些操作,如读写文件 ...

    # 当我们完成所有操作后,可以使用 os.closerange() 关闭这个范围内的所有文件描述符
    os.closerange(low, high)
except OSError as ex:
    # 这里的代码确保无论是否发生异常,文件描述符都会被关闭
    # 但实际上,由于我们已经使用了 os.closerange(),这里的 os.close() 调用是多余的
    os.close(fd3)
    os.close(fd2)
    os.close(fd1)

9.3 os.copy_file_range(src, dst, count, offset_src=None, offset_dst=None)

os.copy_file_range() 是 Python 3.8 版本中引入的一个新函数,它提供了在操作系统级别上复制文件数据的高效方法。这个函数利用了 Linux 的 copy_file_range() 系统调用,允许将数据直接从一个文件描述符复制到另一个文件描述符,而无需用户空间的数据复制,从而提高了数据传输的效率。

函数的命名如下:

os.copy_file_range(src_fd, src_offset, dst_fd, dst_offset, count, flags=0)

参数说明:

  • src_fd: 源文件描述符(int),数据从此文件描述符映射的文件读取。
  • src_offset: 源文件中的偏移量(int),数据从这里开始读取。
  • dst_fd: 目标文件描述符(int),数据被写入这个文件描述符映射的文件。
  • dst_offset: 目标文件中的偏移量(int),数据从这里开始写入。
  • count: 要复制的最大字节数(int)。
  • flags: 控制复制操作的标志(int),目前仅支持 os.COPYFILE_FICLONEos.COPYFILE_FANOUT

函数返回复制的字节数(int),或者在发生错误时返回 -1。

**简单示例:**如何使用 os.copy_file_range() 复制文件数据

import os

# 打开源文件和目标文件
with os.open('source.txt', os.O_RDONLY) as src_fd:
    with os.open('destination.txt', os.O_WRONLY | os.O_CREAT) as dst_fd:
        # 复制文件数据
        bytes_copied = os.copy_file_range(src_fd, 0, dst_fd, 0, os.path.getsize('source.txt'))

        if bytes_copied == -1:
            # 处理复制失败的情况
            raise OSError(f"Failed to copy file data: {os.strerror(os.errno)}")

        print(f"Copied {bytes_copied} bytes from source.txt to destination.txt")

注意:

  • os.copy_file_range() 的使用可能受到操作系统和文件系统的限制。在某些操作系统上,它可能不可用或者对特定的文件类型有限制。此外,它可能不支持跨文件系统的文件复制。
  • os.copy_file_range() 不支持覆盖目标文件现有的数据,除非目标文件被打开为截断模式(即使用了 os.O_TRUNC 标志)。如果目标文件已经包含了数据,并且想在特定偏移量处开始覆盖数据,需要先手动截断文件到正确的位置。
  • 如果源文件和目标文件都在同一个文件系统上,并且源文件是常规文件,那么 os.copy_file_range() 通常比传统的 shutil.copyfile()shutil.copy2() 更高效,因为它减少了用户空间和内核空间之间的数据复制次数。

(未完待续……)


may the odds be ever in your favor ~

标签:文件,Python,百科,描述符,fd,进程,os,ID
From: https://blog.csdn.net/weixin_36928396/article/details/136661588

相关文章

  • Python面向对象编程:合集篇(类、对象、封装、继承和多态)
    Python语言设计之初,就是为了面向对象。所以Python的面向对象更加易于理解。如果你以前学过Java、C++你大概就懂得什么是面向对象,但如果你是第一门编程语言就选择Python,那么也不要害怕。这篇文章,我们将会尽量详细的讲解,把Python面向对象编程的知识讲清楚。接下来我们先来简单的......
  • 基于Django高校校园二手书籍交易系统设计与实现(Pycharm+Python+Mysql)
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、P......
  • 「hosen 日记 · 续」
    2025.3.17我去不会有haosen认为crimson000退役了就不更日记了吧。把「日记·续」改为从上到下更新了,以后可能也许不经常写闲话了......
  • python——代码格式化
    风格与PEP8编写可读代码的一种简单方式是遵循风格指南,它概述了软件项目应该遵循的一组格式化规则。Python改进提案(PythonEnhancementProposal 简称PEP8)就是由Python核心开发团队编写的这样一种风格指南。PEP8甚至还建议:知道什么时候应该不一致——风格指南的建议并非放之......
  • 深度学习入门基于python的理论与实现-第五章误差反向传播法(个人向笔记)
    目录计算图链式法则反向传播加法结点的反向传播乘法结点的反向传播计算图计算图是一种图形化表示计算过程的方法,通常用于机器学习和深度学习中。在计算图中,节点代表操作(例如加法、乘法等),边代表数据流动(即操作的输入和输出)。通过计算图,可以清晰地展示计算过程中各个操作之间的依......
  • python解包是什么?
    在Python中,解包(unpacking)是一种将可迭代对象中的元素分配给变量的技术。这意味着你可以一次性从列表、元组、字符串或任何可迭代对象中提取多个值,并将它们赋值给多个变量。解包可以用于简化代码,使其更易于阅读和维护。基本解包基本解包是将可迭代对象中的元素一一对应地赋值给变......
  • Linux - /dev/tcp/<HOSTNAME>/<PORT>
    Linux中存在一个特殊的设备文件/dev/tcp/<HOSTNAME>/<PORT>,该文件可以直接和目标建立TCP通信,利用这一特性可以进行端口检测。 zzh@ZZHPC:/dev$lh|greptcpzzh@ZZHPC:/dev$echo>/dev/tcp/192.168.1.16/21zzh@ZZHPC:/dev$echo>/dev/tcp/192.168.1.16/22bash:conne......
  • HarmonyOS 与 ArkTS | 自定义组件
    HarmonyOS与ArkTS|自定义组件原效果:代码:@Entry@ComponentstructIndex{build(){Column(){Row(){Column(){this.ItemCard($rawfile('ic_controlcenter_eyeconfort_filled.png'))Divider().margin({top......
  • CMOS模拟集成电路
    模拟集成电路(Baker)9.ModelsforAnalogDesign9.0绪论长沟器件(square-law)短沟器件(aredevelopedwithgraphsshowingdevicecharacteristics)MOSFET的噪声模型9.1Long-ChannelMOSFETs9.1.1TheSquare-LawEquations常识:Oftenthecontrollingparameterinase......
  • CentOS上安装Docker Compose-记录
    在CentOS上安装DockerCompose通常涉及下载其二进制文件并将其设置为可执行文件。这个过程假设你已经安装了Docker。如果还没安装Docker,请先进行安装。以下是安装DockerCompose的步骤:1.**打开终端**:首先,打开你的终端。2.**下载DockerCompose**:使用`curl`命令下载Docke......