os — 其他操作系统接口 — Python 文档
os — 其他操作系统接口
源代码: :source:`Lib/os.py`
该模块提供了一种使用操作系统相关功能的可移植方式。 如果你只是想读或写一个文件见open(),如果你想操作路径,见os.path模块,如果你想读所有的行在命令行上的所有文件中,请参阅 fileinput 模块。 要创建临时文件和目录,请参阅 tempfile 模块,有关高级文件和目录处理,请参阅 shutil 模块。
有关这些功能可用性的说明:
- Python所有内置的操作系统相关模块的设计都是这样的,只要有相同的功能,就使用相同的接口; 例如,函数
os.stat(path)
以相同的格式返回有关 path 的统计信息(恰好源自 POSIX 接口)。 - 特定操作系统特有的扩展也可以通过 os 模块获得,但使用它们当然会对可移植性构成威胁。
- 所有接受路径或文件名的函数都接受字节和字符串对象,如果返回路径或文件名,则会产生相同类型的对象。
- 在 VxWorks 上,不支持 os.fork、os.execv 和 os.spawn*p*。
- exception os.error
- 内置 OSError 异常的别名。
- os.name
导入的操作系统相关模块的名称。 目前已注册以下名称:
'posix'
、'nt'
、'java'
。
文件名、命令行参数和环境变量
在 Python 中,文件名、命令行参数和环境变量使用字符串类型表示。 在某些系统上,在将这些字符串传递给操作系统之前,需要将这些字符串与字节进行解码。 Python 使用文件系统编码来执行此转换(请参阅 sys.getfilesystemencoding())。
3.1 版更改:在某些系统上,使用文件系统编码的转换可能会失败。 在这种情况下,Python 使用 surrogateescape 编码错误处理程序 ,这意味着不可解码的字节在解码时被 Unicode 字符 U+DCxx 替换,并且这些在编码时再次转换为原始字节。
文件系统编码必须保证成功解码 128 以下的所有字节。 如果文件系统编码无法提供这种保证,API 函数可能会引发 UnicodeErrors。
工艺参数
这些函数和数据项提供信息并对当前进程和用户进行操作。
- os.ctermid()
- 返回与进程控制终端对应的文件名。
- os.environ
mapping 对象,其中键和值是表示过程环境的字符串。 例如,
environ['HOME']
是主目录的路径名(在某些平台上),相当于 C 中的getenv("HOME")
。这个映射是在第一次导入 os 模块时捕获的,通常在 Python 启动期间作为处理
site.py
的一部分。 在此之后对环境所做的更改不会反映在os.environ
中,除了直接修改os.environ
所做的更改。此映射可用于修改环境以及查询环境。 putenv() 映射修改时会自动调用。
在 Unix 上,键和值使用 sys.getfilesystemencoding() 和
'surrogateescape'
错误处理程序。 如果您想使用不同的编码,请使用 environb。笔记
直接调用putenv()不会改变
os.environ
,所以最好修改os.environ
。笔记
在某些平台上,包括 FreeBSD 和 macOS,设置
environ
可能会导致内存泄漏。 请参阅putenv()
的系统文档。您可以删除此映射中的项目以取消设置环境变量。 unsetenv() 将在从
os.environ
中删除项目时自动调用,并且当调用pop()
或clear()
方法之一时。3.9 版更改: 更新以支持 PEP 584 的合并 (
|
) 和更新 (|=
) 运算符.
- os.environb
environ 的字节版本:一个 mapping 对象,其中键和值都是表示过程环境的 bytes 对象。 environ 和 environb 是同步的(修改 environb 更新 environ,反之亦然)。
environb 仅在 supports_bytes_environ 为
True
时可用。3.2 版中的新功能。
3.9 版更改: 更新以支持 PEP 584 的合并 (
|
) 和更新 (|=
) 运算符.
- os.chdir(path)
os.fchdir(fd)
os.getcwd()
- 这些函数在 文件和目录 中有描述。
- os.fsencode(filename)
使用
'surrogateescape'
错误处理程序将 path-like filename 编码为文件系统编码,或在 Windows 上使用'strict'
; 返回 bytes 不变。fsdecode() 是反向函数。
3.2 版中的新功能。
3.6 版更改: 添加支持以接受实现 os.PathLike 接口的对象。
- os.fsdecode(filename)
使用
'surrogateescape'
错误处理程序或 Windows 上的'strict'
从文件系统编码中解码 path-like filename; 返回 str 不变。fsencode() 是反向函数。
3.2 版中的新功能。
3.6 版更改: 添加支持以接受实现 os.PathLike 接口的对象。
- os.fspath(path)
返回路径的文件系统表示。
如果传入 str 或 bytes,则原样返回。 否则,调用
__fspath__()
并返回其值,只要它是 str 或 bytes 对象。 在所有其他情况下,会引发 TypeError。3.6 版中的新功能。
- class os.PathLike
表示文件系统路径的对象的 抽象基类 ,例如 pathlib.PurePath。
3.6 版中的新功能。
- os.getenv(key, default=None)
如果存在,则返回环境变量 key 的值,如果不存在,则返回 default。 key, default 结果是str。
在 Unix 上,键和值使用 sys.getfilesystemencoding() 和
'surrogateescape'
错误处理程序进行解码。 如果您想使用不同的编码,请使用 os.getenvb()。
- os.getenvb(key, default=None)
如果存在,则返回环境变量 key 的值,如果不存在,则返回 default。 key, default 和结果是字节。
getenvb() 仅在 supports_bytes_environ 为
True
时可用。3.2 版中的新功能。
- os.get_exec_path(env=None)
返回将在启动进程时搜索命名可执行文件(类似于 shell)的目录列表。 env,当指定时,应该是一个用于查找 PATH 的环境变量字典。 默认情况下,当 env 为
None
时,使用 environ。3.2 版中的新功能。
- os.getegid()
- 返回当前进程的有效组 ID。 这对应于当前进程中正在执行的文件上的“set id”位。
- os.geteuid()
- 返回当前进程的有效用户 ID。
- os.getgid()
- 返回当前进程的真实组 ID。
- os.getgrouplist(user, group)
返回 user 所属的组 ID 列表。 如果 group 不在列表中,则包括在内; 通常,group 被指定为 user 的密码记录中的组 ID 字段。
3.3 版中的新功能。
- os.getgroups()
返回与当前进程关联的补充组 ID 列表。
笔记
在 macOS 上,getgroups() 行为与其他 Unix 平台有些不同。 如果 Python 解释器是使用
10.5
或更早的部署目标构建的,则 getgroups() 返回与当前用户进程关联的有效组 ID 列表; 该列表仅限于系统定义的条目数,通常为 16 个,如果有适当的特权,可以通过调用 setgroups() 进行修改。 如果使用大于10.5
的部署目标构建,则 getgroups() 返回与进程的有效用户 ID 关联的用户的当前组访问列表; 组访问列表可能会在进程的生命周期内发生变化,它不受调用 setgroups() 的影响,并且其长度不限于 16。 部署目标值MACOSX_DEPLOYMENT_TARGET
可以通过 sysconfig.get_config_var() 获得。
- os.getlogin()
- 返回登录进程控制终端的用户名。 对于大多数用途,使用 getpass.getuser() 更有用,因为后者检查环境变量
LOGNAME
或USERNAME
找出用户是谁,回退到pwd.getpwuid(os.getuid())[0]
获取当前真实用户id的登录名。
- os.getpgid(pid)
- 返回进程id为pid的进程的进程组id。 如果 pid 为 0,则返回当前进程的进程组 ID。
- os.getpgrp()
- 返回当前进程组的 id。
- os.getpid()
- 返回当前进程 ID。
- os.getppid()
返回父进程 ID。 当父进程退出时,在 Unix 上返回的 id 是 init 进程 (1) 中的一个,在 Windows 上它仍然是相同的 id,可能已经被另一个进程重用。
3.2 版更改: 增加了对 Windows 的支持。
- os.getpriority(which, who)
获取程序调度优先级。 值 which 是 PRIO_PROCESS、PRIO_PGRP 或 PRIO_USER 之一,并且 who 被解释为相对于 [ X145X]which(PRIO_PROCESS 的进程标识符,PRIO_PGRP 的进程组标识符,以及 PRIO_USER 的用户 ID)。 who 的零值表示(分别)调用进程、调用进程的进程组或调用进程的真实用户 ID。
3.3 版中的新功能。
- os.PRIO_PROCESS
os.PRIO_PGRP
os.PRIO_USER getpriority() 和 setpriority() 函数的参数。
3.3 版中的新功能。
- os.getresuid()
返回一个元组 (ruid, euid, suid) 表示当前进程的真实、有效和保存的用户 ID。
3.2 版中的新功能。
- os.getresgid()
返回一个元组 (rgid, egid, sgid) 表示当前进程的真实、有效和保存的组 ID。
3.2 版中的新功能。
- os.getuid()
- 返回当前进程的真实用户 ID。
- os.initgroups(username, gid)
调用系统 initgroups() 以使用指定用户名所属的所有组以及指定的组 ID 来初始化组访问列表。
3.2 版中的新功能。
- os.putenv(key, value)
将名为 key 的环境变量设置为字符串 value。 对环境的此类更改会影响以 os.system()、popen() 或 fork() 和 execv() 开头的子进程.
对
os.environ
中项目的赋值会自动转换为对 putenv() 的相应调用; 但是,对 putenv() 的调用不会更新os.environ
,因此实际上最好分配给os.environ
的项目。笔记
在某些平台上,包括 FreeBSD 和 macOS,设置
environ
可能会导致内存泄漏。 请参阅putenv()
的系统文档。3.9 版本变更: 该功能现在一直可用。
- os.setegid(egid)
- 设置当前进程的有效组 ID。
- os.seteuid(euid)
- 设置当前进程的有效用户 ID。
- os.setgid(gid)
- 设置当前进程的组 ID。
- os.setgroups(groups)
将与当前进程关联的补充组 ID 列表设置为 groups。 groups 必须是一个序列,每个元素必须是一个标识一个组的整数。 此操作通常仅对超级用户可用。
笔记
在 macOS 上,groups 的长度不能超过系统定义的有效组 ID 的最大数量,通常为 16。 请参阅 getgroups() 的文档,了解可能无法通过调用 setgroups() 返回相同组列表集的情况。
- os.setpgrp()
- 根据实现的版本(如果有)调用系统调用
setpgrp()
或setpgrp(0, 0)
。 有关语义,请参阅 Unix 手册。
- os.setpgid(pid, pgrp)
- 调用系统调用
setpgid()
,将id为pid的进程的进程组id设置为id为pgrp的进程组。 有关语义,请参阅 Unix 手册。
- os.setpriority(which, who, priority)
设置节目调度优先级。 值 which 是 PRIO_PROCESS、PRIO_PGRP 或 PRIO_USER 之一,并且 who 被解释为相对于 [ X145X]which(PRIO_PROCESS 的进程标识符,PRIO_PGRP 的进程组标识符,以及 PRIO_USER 的用户 ID)。 who 的零值表示(分别)调用进程、调用进程的进程组或调用进程的真实用户 ID。 priority 是 -20 到 19 范围内的值。 默认优先级为 0; 较低的优先级会导致更有利的调度。
3.3 版中的新功能。
- os.setregid(rgid, egid)
- 设置当前进程的真实有效的组 ID。
- os.setresgid(rgid, egid, sgid)
设置当前进程的真实、有效和保存的组 ID。
3.2 版中的新功能。
- os.setresuid(ruid, euid, suid)
设置当前进程的真实、有效和保存的用户 ID。
3.2 版中的新功能。
- os.setreuid(ruid, euid)
- 设置当前进程的真实有效用户 ID。
- os.getsid(pid)
- 调用系统调用
getsid()
。 有关语义,请参阅 Unix 手册。
- os.setsid()
- 调用系统调用
setsid()
。 有关语义,请参阅 Unix 手册。
- os.setuid(uid)
- 设置当前进程的用户 ID。
- os.strerror(code)
- 返回code中错误代码对应的错误信息。 在给定未知错误编号时
strerror()
返回NULL
的平台上,会引发 ValueError。
- os.supports_bytes_environ
True
如果环境的本机操作系统类型是字节(例如False
在 Windows 上)。3.2 版中的新功能。
- os.umask(mask)
- 设置当前数字 umask 并返回之前的 umask。
- os.uname()
返回标识当前操作系统的信息。 返回值是一个具有五个属性的对象:
sysname
- 操作系统名称nodename
- 网络上的机器名称(实现定义)release
- 操作系统发布version
- 操作系统版本machine
- 硬件标识符
为了向后兼容,这个对象也是可迭代的,表现得像一个包含
sysname
、nodename
、release
、version
和 [ X149X] 的顺序。一些系统将
nodename
截断为 8 个字符或首部; 获取主机名的更好方法是 socket.gethostname() 甚至socket.gethostbyaddr(socket.gethostname())
。3.3 版更改: 返回类型从元组更改为具有命名属性的类元组对象。
- os.unsetenv(key)
取消设置(删除)名为 key 的环境变量。 对环境的此类更改会影响以 os.system()、popen() 或 fork() 和 execv() 开头的子进程.
删除
os.environ
中的项目会自动转换为对 unsetenv() 的相应调用; 然而,调用 unsetenv() 不会更新os.environ
,所以实际上最好删除os.environ
的项目。3.9 版本变化: 该功能现在一直可用,在 Windows 上也可用。
文件对象创建
这些函数创建新的 文件对象 。 (另见 open() 打开文件描述符。)
- os.fdopen(fd, *args, **kwargs)
- 返回连接到文件描述符 fd 的打开文件对象。 这是 open() 内置函数的别名并接受相同的参数。 唯一的区别是 fdopen() 的第一个参数必须始终是整数。
文件描述符操作
这些函数对使用文件描述符引用的 I/O 流进行操作。
文件描述符是与当前进程打开的文件相对应的小整数。 例如,标准输入通常是文件描述符 0,标准输出是 1,标准错误是 2。 进程打开的其他文件将被分配 3、4、5 等。 “文件描述符”这个名字有点骗人; 在 Unix 平台上,套接字和管道也被文件描述符引用。
fileno() 方法可用于在需要时获取与 文件对象 关联的文件描述符。 请注意,直接使用文件描述符将绕过文件对象方法,忽略数据的内部缓冲等方面。
- os.close(fd)
关闭文件描述符 fd。
- os.closerange(fd_low, fd_high)
关闭从 fd_low(含)到 fd_high(不含)的所有文件描述符,忽略错误。 相当于(但比):
for fd in range(fd_low, fd_high): try: os.close(fd) except OSError: pass
- os.copy_file_range(src, dst, count, offset_src=None, offset_dst=None)
从文件描述符 src 复制 count 个字节,从偏移量 offset_src 开始,到文件描述符 dst,从偏移量 offset_dst[ 开始X171X]。 如果offset_src为None,则从当前位置读取src; 分别为 offset_dst。 src 和 dst 指向的文件必须位于同一个文件系统中,否则会在 errno 设置为 的情况下引发 OSError错误号.EXDEV。
完成此复制无需额外成本将数据从内核传输到用户空间,然后再返回内核。 此外,一些文件系统可以实现额外的优化。 复制完成就像两个文件都以二进制文件打开一样。
返回值是复制的字节数。 这可能少于请求的金额。
3.8 版中的新功能。
- os.device_encoding(fd)
- 如果连接到终端,则返回描述与 fd 关联的设备的编码的字符串; 否则返回 无 。
- os.dup(fd)
返回文件描述符 fd 的副本。 新的文件描述符是 不可继承的 。
在 Windows 上,复制标准流(0:stdin,1:stdout,2:stderr)时,新的文件描述符是 inheritable。
3.4 版更改: 新的文件描述符现在不可继承。
- os.dup2(fd, fd2, inheritable=True)
将文件描述符 fd 复制到 fd2,必要时先关闭后者。 返回 fd2。 新的文件描述符默认为 inheritable,如果 inheritable 为
False
,则不可继承。3.4 版更改: 添加可选的 可继承 参数。
3.7 版更改: 成功返回 fd2。 以前,总是返回
None
。
- os.fchmod(fd, mode)
- 将 fd 给出的文件模式更改为数字 mode。 有关 mode 的可能值,请参阅 chmod() 的文档。 从 Python 3.3 开始,这相当于
os.chmod(fd, mode)
。
- os.fchown(fd, uid, gid)
- 将 fd 给出的文件的所有者和组 ID 更改为数字 uid 和 gid。 要保持其中一个 id 不变,请将其设置为 -1。 参见 chown()。 从 Python 3.3 开始,这相当于
os.chown(fd, uid, gid)
。
- os.fdatasync(fd)
强制将带有文件描述符 fd 的文件写入磁盘。 不强制更新元数据。
笔记
此功能在 MacOS 上不可用。
- os.fpathconf(fd, name)
返回与打开文件相关的系统配置信息。 name 指定要检索的配置值; 它可能是一个字符串,它是定义的系统值的名称; 这些名称在许多标准(POSIX.1、Unix 95、Unix 98 等)中都有规定。 一些平台还定义了其他名称。 主机操作系统已知的名称在
pathconf_names
字典中给出。 对于未包含在该映射中的配置变量,也接受为 name 传递整数。如果 name 是一个字符串并且未知,则会引发 ValueError。 如果主机系统不支持 name 的特定值,即使它包含在
pathconf_names
中,也会引发 OSError 和 errno.EINVAL 为错误编号。从 Python 3.3 开始,这相当于
os.pathconf(fd, name)
。
- os.fstat(fd)
获取文件描述符 fd 的状态。 返回一个 stat_result 对象。
从 Python 3.3 开始,这相当于
os.stat(fd)
。也可以看看
stat() 函数。
- os.fstatvfs(fd)
- 返回有关包含与文件描述符 fd 关联的文件的文件系统的信息,例如 statvfs()。 从 Python 3.3 开始,这相当于
os.statvfs(fd)
。
- os.fsync(fd)
强制将带有文件描述符 fd 的文件写入磁盘。 在 Unix 上,这会调用原生的
fsync()
函数; 在 Windows 上,MS_commit()
函数。如果你从一个缓冲的 Python 文件对象 f 开始,首先做
f.flush()
,然后做os.fsync(f.fileno())
,以确保所有内部缓冲区与 f 关联的内容被写入磁盘。
- os.ftruncate(fd, length)
截断文件描述符fd对应的文件,使其大小最多为length个字节。 从 Python 3.3 开始,这相当于
os.truncate(fd, length)
。3.5 版更改: 增加了对 Windows 的支持
- os.get_blocking(fd)
获取文件描述符的阻塞模式:
False
如果设置了 O_NONBLOCK 标志,则True
如果清除标志。另见 set_blocking() 和 socket.socket.setblocking()。
3.5 版中的新功能。
- os.isatty(fd)
- 如果文件描述符 fd 已打开并连接到 tty(类似)设备,则返回
True
,否则返回False
。
- os.lockf(fd, cmd, len)
在打开的文件描述符上应用、测试或删除 POSIX 锁。 fd 是一个打开的文件描述符。 cmd 指定要使用的命令 - F_LOCK、F_TLOCK、F_ULOCK 或 F_TEST 之一。 len 指定要锁定的文件部分。
3.3 版中的新功能。
- os.F_LOCK
os.F_TLOCK
os.F_ULOCK
os.F_TEST 指定 lockf() 将采取什么操作的标志。
3.3 版中的新功能。
- os.lseek(fd, pos, how)
- 设置文件描述符fd的当前位置为pos,修改为how:SEEK_SET或
0
设置相对于文件开头的位置; SEEK_CUR 或1
相对于当前位置设置; SEEK_END 或2
将其设置为相对于文件的结尾。 从头开始返回以字节为单位的新光标位置。
- os.SEEK_SET
os.SEEK_CUR
os.SEEK_END lseek() 函数的参数。 它们的值分别为 0、1 和 2。
3.3 新功能: 某些操作系统可以支持其他值,例如
os.SEEK_HOLE
或os.SEEK_DATA
。
- os.open(path, flags, mode=0o777, *, dir_fd=None)
打开文件 path 并根据 flags 设置各种标志,可能根据 mode 设置其模式。 在计算mode时,首先屏蔽掉当前的umask值。 返回新打开文件的文件描述符。 新的文件描述符是 不可继承的 。
有关标志和模式值的说明,请参阅 C 运行时文档; 标志常量(如 O_RDONLY 和 O_WRONLY)在 os 模块中定义。 特别是,在 Windows 上添加 O_BINARY 需要以二进制模式打开文件。
该函数可以通过 dir_fd 参数支持相对于目录描述符 的 路径。
3.4 版更改: 新的文件描述符现在不可继承。
笔记
此函数用于低级 I/O。 对于正常使用,使用内置函数 open(),它返回一个 文件对象 和
read()
和write()
方法(以及更多)。 要将文件描述符包装在文件对象中,请使用 fdopen()。3.3 版新功能:dir_fd 参数。
3.5 版更改: 如果系统调用被中断并且信号处理程序没有引发异常,该函数现在会重试系统调用而不是引发 InterruptedError 异常(参见 ]PEP 475 的基本原理)。
3.6 版更改: 接受 类路径对象 。
以下常量是 open() 函数的 flags 参数的选项。 它们可以使用按位或运算符 |
组合。 其中一些并非在所有平台上都可用。 有关它们的可用性和使用的说明,请参阅 Unix 上的 open(2) 手册页或 Windows 上的 MSDN 手册页。
- os.O_RDONLY
os.O_WRONLY
os.O_RDWR
os.O_APPEND
os.O_CREAT
os.O_EXCL
os.O_TRUNC
- 上述常量在 Unix 和 Windows 上可用。
- os.O_DSYNC
os.O_RSYNC
os.O_SYNC
os.O_NDELAY
os.O_NONBLOCK
os.O_NOCTTY
os.O_CLOEXEC 上述常量仅在 Unix 上可用。
3.3 版更改: 添加 O_CLOEXEC 常量。
- os.O_BINARY
os.O_NOINHERIT
os.O_SHORT_LIVED
os.O_TEMPORARY
os.O_RANDOM
os.O_SEQUENTIAL
os.O_TEXT
- 上述常量仅在 Windows 上可用。
- os.O_ASYNC
os.O_DIRECT
os.O_DIRECTORY
os.O_NOFOLLOW
os.O_NOATIME
os.O_PATH
os.O_TMPFILE
os.O_SHLOCK
os.O_EXLOCK 上述常量是扩展,如果它们不是由 C 库定义的,则不存在。
- os.openpty()
打开一个新的伪终端对。 分别为 pty 和 tty 返回一对文件描述符
(master, slave)
。 新的文件描述符是 不可继承的 。 对于(稍微)更便携的方法,请使用 pty 模块。3.4 版更改: 新的文件描述符现在是不可继承的。
- os.pipe()
创建管道。 返回一对分别可用于读取和写入的文件描述符
(r, w)
。 新的文件描述符是 不可继承的 。3.4 版更改: 新的文件描述符现在是不可继承的。
- os.pipe2(flags)
创建一个带有 flags 原子设置的管道。 flags 可以通过将这些值中的一个或多个组合在一起来构造:O_NONBLOCK、O_CLOEXEC。 返回一对分别可用于读取和写入的文件描述符
(r, w)
。3.3 版中的新功能。
- os.posix_fallocate(fd, offset, len)
确保为 fd 指定的文件分配足够的磁盘空间,从 offset 开始并继续 len 字节。
3.3 版中的新功能。
- os.posix_fadvise(fd, offset, len, advice)
宣布以特定模式访问数据的意图,从而允许内核进行优化。 该建议适用于由 fd 指定的文件区域,从 offset 开始并持续 len 个字节。 advice 是 POSIX_FADV_NORMAL, POSIX_FADV_SEQUENTIAL, POSIX_FADV_RANDOM, POSIX_FADV_NORMAL, POSIX_FADV_SEQUENTIAL, POSIX_FADV_NORMAL POSIX_FADV_3D1X6NEX3_5X6_3DV1X5X1W1X3_3DV1X1 POSIX_FADV_DONTNEED。
3.3 版中的新功能。
- os.POSIX_FADV_NORMAL
os.POSIX_FADV_SEQUENTIAL
os.POSIX_FADV_RANDOM
os.POSIX_FADV_NOREUSE
os.POSIX_FADV_WILLNEED
os.POSIX_FADV_DONTNEED 可以在 posix_fadvise() 中的 advice 中使用的标志,用于指定可能使用的访问模式。
3.3 版中的新功能。
- os.pread(fd, n, offset)
从文件描述符 fd 在 offset 的位置读取最多 n 个字节,保持文件偏移量不变。
返回一个包含读取字节的字节串。 如果已到达 fd 引用的文件末尾,则返回一个空字节对象。
3.3 版中的新功能。
- os.preadv(fd, buffers, offset, flags=0)
从位于 offset 位置的文件描述符 fd 读取到可变的 bytes-like objects buffers,保持文件偏移不变。 将数据传输到每个缓冲区,直到它已满,然后继续移动到序列中的下一个缓冲区以保存其余数据。
flags 参数包含零个或多个以下标志的按位或:
返回实际读取的总字节数,可能小于所有对象的总容量。
操作系统可能会对可以使用的缓冲区数量设置限制(sysconf() 值
'SC_IOV_MAX'
)。结合 os.readv() 和 os.pread() 的功能。
3.7 版中的新功能。
- os.RWF_NOWAIT
不要等待不是立即可用的数据。 如果指定了此标志,则系统调用将在必须从后备存储读取数据或等待锁定时立即返回。
如果成功读取了某些数据,它将返回读取的字节数。 如果没有读取字节,它将返回
-1
并将 errno 设置为 errno.EAGAIN。3.7 版中的新功能。
- os.RWF_HIPRI
高优先级读/写。 允许基于块的文件系统使用设备轮询,这提供了较低的延迟,但可能会使用额外的资源。
目前,在 Linux 上,此功能仅可用于使用 O_DIRECT 标志打开的文件描述符。
3.7 版中的新功能。
- os.pwrite(fd, str, offset)
将 str 中的字节串写入文件描述符 fd 的位置 offset,保持文件偏移量不变。
返回实际写入的字节数。
3.3 版中的新功能。
- os.pwritev(fd, buffers, offset, flags=0)
将 buffers 内容写入文件描述符 fd 的偏移量 offset,保持文件偏移量不变。 buffers 必须是一个 bytes-like objects 的序列。 缓冲区按数组顺序处理。 第一个缓冲区的全部内容在进入第二个缓冲区之前被写入,依此类推。
flags 参数包含零个或多个以下标志的按位或:
返回实际写入的总字节数。
操作系统可能会对可以使用的缓冲区数量设置限制(sysconf() 值
'SC_IOV_MAX'
)。结合 os.writev() 和 os.pwrite() 的功能。
3.7 版中的新功能。
- os.RWF_DSYNC
提供相当于 O_DSYNC
open(2)
标志的每次写入。 此标志效果仅适用于系统调用写入的数据范围。3.7 版中的新功能。
- os.RWF_SYNC
提供相当于 O_SYNC
open(2)
标志的每次写入。 此标志效果仅适用于系统调用写入的数据范围。3.7 版中的新功能。
- os.read(fd, n)
从文件描述符 fd 中最多读取 n 个字节。
返回一个包含读取字节的字节串。 如果已到达 fd 引用的文件末尾,则返回一个空字节对象。
笔记
此函数用于低级 I/O,并且必须应用于由 os.open() 或 pipe() 返回的文件描述符。 读取由内置函数 open() 或 popen() 或 fdopen() 或 sys 返回的“文件对象” .stdin,使用其
read()
或readline()
方法。3.5 版更改: 如果系统调用被中断并且信号处理程序没有引发异常,该函数现在会重试系统调用而不是引发 InterruptedError 异常(参见 ]PEP 475 的基本原理)。
- os.sendfile(out_fd, in_fd, offset, count)
os.sendfile(out_fd, in_fd, offset, count, headers=(), trailers=(), flags=0) 将 count 个字节从文件描述符 in_fd 复制到文件描述符 out_fd,从 offset 开始。 返回发送的字节数。 当达到 EOF 时返回
0
。定义 sendfile() 的所有平台都支持第一个函数表示法。
在 Linux 上,如果 offset 指定为
None
,则从 in_fd 的当前位置读取字节并更新 in_fd 的位置.第二种情况可以在 macOS 和 FreeBSD 上使用,其中 headers 和 trailers 是在写入 in_fd 的数据之前和之后写入的任意缓冲区序列。 它返回与第一种情况相同的结果。
在 macOS 和 FreeBSD 上,count 的值
0
指定发送直到到达 in_fd 的末尾。所有平台都支持套接字作为 out_fd 文件描述符,一些平台允许其他类型(例如 常规文件,管道)以及。
跨平台应用程序不应使用 headers、trailers 和 flags 参数。
笔记
有关 sendfile() 的更高级别包装器,请参阅 socket.socket.sendfile()。
3.3 版中的新功能。
3.9 版更改: 参数 out 和 in 重命名为 out_fd 和 in_fd。
- os.set_blocking(fd, blocking)
设置指定文件描述符的阻塞模式。 如果阻塞为
False
,则设置 O_NONBLOCK 标志,否则清除该标志。另见 get_blocking() 和 socket.socket.setblocking()。
3.5 版中的新功能。
- os.SF_NODISKIO
os.SF_MNOWAIT
os.SF_SYNC sendfile() 函数的参数(如果实现支持它们)。
3.3 版中的新功能。
- os.readv(fd, buffers)
从文件描述符 fd 读取到许多可变的 字节类对象 缓冲区 。 将数据传输到每个缓冲区,直到它已满,然后继续移动到序列中的下一个缓冲区以保存其余数据。
返回实际读取的总字节数,可能小于所有对象的总容量。
操作系统可能会对可以使用的缓冲区数量设置限制(sysconf() 值
'SC_IOV_MAX'
)。3.3 版中的新功能。
- os.tcgetpgrp(fd)
- 返回与 fd 给出的终端关联的进程组(os.open() 返回的打开文件描述符)。
- os.tcsetpgrp(fd, pg)
- 将与由 fd(由 os.open() 返回的打开文件描述符)给出的终端关联的进程组设置为 pg。
- os.ttyname(fd)
- 返回一个字符串,该字符串指定与文件描述符 fd 关联的终端设备。 如果 fd 未与终端设备关联,则会引发异常。
- os.write(fd, str)
将 str 中的字节串写入文件描述符 fd。
返回实际写入的字节数。
笔记
此函数用于低级 I/O,并且必须应用于由 os.open() 或 pipe() 返回的文件描述符。 写入由内置函数 open() 或 popen() 或 fdopen() 或 sys 返回的“文件对象” .stdout 或 sys.stderr,使用其
write()
方法。3.5 版更改: 如果系统调用被中断并且信号处理程序没有引发异常,该函数现在会重试系统调用而不是引发 InterruptedError 异常(参见 ]PEP 475 的基本原理)。
- os.writev(fd, buffers)
将 buffers 的内容写入文件描述符 fd。 buffers 必须是一个 bytes-like objects 的序列。 缓冲区按数组顺序处理。 第一个缓冲区的全部内容在进入第二个缓冲区之前被写入,依此类推。
返回实际写入的总字节数。
操作系统可能会对可以使用的缓冲区数量设置限制(sysconf() 值
'SC_IOV_MAX'
)。3.3 版中的新功能。
查询终端大小
3.3 版中的新功能。
- os.get_terminal_size(fd=STDOUT_FILENO)
将终端窗口的大小返回为
(columns, lines)
,类型为 terminal_size 的元组。可选参数
fd
(默认STDOUT_FILENO
,或标准输出)指定应查询哪个文件描述符。如果文件描述符未连接到终端,则会引发 OSError。
shutil.get_terminal_size() 是通常应该使用的高级函数,
os.get_terminal_size
是低级实现。
- class os.terminal_size
元组的子类,包含终端窗口大小的
(columns, lines)
。- columns
终端窗口的宽度(以字符为单位)。
- lines
终端窗口的高度(以字符为单位)。
文件描述符的继承
3.4 版中的新功能。
文件描述符有一个“可继承”标志,表示文件描述符是否可以被子进程继承。 从 Python 3.4 开始,Python 创建的文件描述符默认是不可继承的。
在 UNIX 上,不可继承的文件描述符在执行新程序时在子进程中关闭,其他文件描述符被继承。
在 Windows 上,不可继承的句柄和文件描述符在子进程中关闭,标准流(文件描述符 0、1 和 2:stdin、stdout 和 stderr)除外,它们总是被继承。 使用 spawn* 函数,所有可继承的句柄和所有可继承的文件描述符都被继承。 使用 subprocess 模块,关闭除标准流之外的所有文件描述符,并且仅当 close_fds 参数为 False
时才继承可继承句柄。
- os.get_inheritable(fd)
- 获取指定文件描述符的“可继承”标志(布尔值)。
- os.set_inheritable(fd, inheritable)
- 设置指定文件描述符的“可继承”标志。
- os.get_handle_inheritable(handle)
- 获取指定句柄的“可继承”标志(布尔值)。
- os.set_handle_inheritable(handle, inheritable)
- 设置指定句柄的“可继承”标志。
文件和目录
在某些 Unix 平台上,其中许多函数支持以下一项或多项功能:
指定文件描述符: 通常,提供给 os 模块中的函数的 path 参数必须是指定文件路径的字符串。 但是,某些函数现在可以为它们的 path 参数接受一个打开的文件描述符。 然后该函数将对描述符引用的文件进行操作。 (对于 POSIX 系统,Python 将调用以
f
为前缀的函数的变体(例如 调用fchdir
而不是chdir
))您可以使用 os.supports_fd 检查是否可以将 path 指定为平台上特定功能的文件描述符。 如果此功能不可用,使用它会引发 NotImplementedError。
如果该函数还支持 [X30X]dir_fd 或 follow_symlinks 参数,则在提供 path 作为文件描述符时指定其中之一是错误的。
paths relative to directory descriptors: 如果dir_fd不是
None
,应该是一个指向一个目录的文件描述符,并且操作的路径应该是relative; 然后路径将相对于该目录。 如果路径是绝对路径,则忽略 dir_fd。 (对于 POSIX 系统,Python 将调用带有at
后缀并可能带有f
前缀的函数变体(例如 调用faccessat
而不是access
)。您可以使用 os.supports_dir_fd 检查平台上的特定功能是否支持 dir_fd。 如果它不可用,使用它会引发 NotImplementedError。
不跟随符号链接: 如果 follow_symlinks 是
False
,并且要操作的路径的最后一个元素是符号链接,则该函数将对符号链接本身进行操作而不是链接指向的文件。 (对于 POSIX 系统,Python 将调用函数的l...
变体。)您可以使用 os.supports_follow_symlinks 检查平台上的特定功能是否支持 follow_symlinks。 如果它不可用,使用它会引发 NotImplementedError。
- os.access(path, mode, *, dir_fd=None, effective_ids=False, follow_symlinks=True)
使用真实的 uid/gid 来测试对 路径 的访问。 请注意,大多数操作将使用有效的 uid/gid,因此可以在 suid/sgid 环境中使用此例程来测试调用用户是否具有对 path 的指定访问权限。 mode应该是F_OK来测试path是否存在,也可以是R_OK、中的一个或多个的包含OR X141X]W_OK 和 X_OK 来测试权限。 如果允许访问,则返回 True,否则返回 False。 有关更多信息,请参阅 Unix 手册页 access(2)。
如果 effective_ids 是
True
,access() 将使用有效的 uid/gid 而不是真实的 uid/gid 执行其访问检查。 effective_ids 可能不支持您的平台; 您可以使用 os.supports_effective_ids 检查它是否可用。 如果它不可用,使用它会引发 NotImplementedError。笔记
使用 access() 检查用户是否被授权例如 在实际使用 open() 之前打开文件会产生安全漏洞,因为用户可能会利用检查和打开文件之间的短时间间隔来操纵它。 最好使用 EAFP 技术。 例如:
if os.access("myfile", os.R_OK): with open("myfile") as fp: return fp.read() return "some default data"
最好写成:
try: fp = open("myfile") except PermissionError: return "some default data" else: with fp: return fp.read()
笔记
即使 access() 表明它们会成功,I/O 操作也可能会失败,特别是对于网络文件系统上的操作,其权限语义可能超出通常的 POSIX 权限位模型。
3.3 版本变更: 添加了 dir_fd、effective_ids 和 follow_symlinks 参数。
3.6 版更改: 接受 类路径对象 。
- os.F_OK
os.R_OK
os.W_OK
os.X_OK
- 作为 access() 的 mode 参数传递的值,分别测试 path 的存在性、可读性、可写性和可执行性。
- os.chdir(path)
将当前工作目录更改为 path。
该函数可以支持指定文件描述符。 描述符必须指向打开的目录,而不是打开的文件。
此函数可以引发 OSError 和子类,例如 FileNotFoundError、PermissionError 和 NotADirectoryError。
3.3 新功能: 增加了在某些平台上指定 path 作为文件描述符的支持。
3.6 版更改: 接受 类路径对象 。
- os.chflags(path, flags, *, follow_symlinks=True)
将 path 的标志设置为数字 flags。 flags 可以采用以下值的组合(按位或)(在 stat 模块中定义):
此功能可以支持 不跟随符号链接 。
3.3 版新功能:follow_symlinks 参数。
3.6 版更改: 接受 类路径对象 。
- os.chmod(path, mode, *, dir_fd=None, follow_symlinks=True)
将 path 的模式更改为数字 mode。 mode 可以采用以下值之一(在 stat 模块中定义)或它们的按位或组合:
此函数可以支持 指定文件描述符 、相对于目录描述符的 路径 和 不遵循符号链接 。
笔记
尽管 Windows 支持 chmod(),但您只能用它设置文件的只读标志(通过
stat.S_IWRITE
和stat.S_IREAD
常量或相应的整数值)。 所有其他位都被忽略。3.3 版新功能: 添加了对指定 path 作为打开文件描述符的支持,以及 dir_fd 和 follow_symlinks 参数。
3.6 版更改: 接受 类路径对象 。
- os.chown(path, uid, gid, *, dir_fd=None, follow_symlinks=True)
将 path 的所有者和组 ID 更改为数字 uid 和 gid。 要保持其中一个 id 不变,请将其设置为 -1。
此函数可以支持 指定文件描述符 、相对于目录描述符的 路径 和 不遵循符号链接 。
请参阅 shutil.chown() 以获取除数字 id 外还接受名称的高级函数。
3.3 版新功能: 添加了对指定 path 作为打开文件描述符的支持,以及 dir_fd 和 follow_symlinks 参数。
3.6 版更改: 支持 类路径对象 。
- os.chroot(path)
将当前进程的根目录更改为path。
3.6 版更改: 接受 类路径对象 。
- os.fchdir(fd)
- 将当前工作目录更改为文件描述符 fd 表示的目录。 描述符必须指向打开的目录,而不是打开的文件。 从 Python 3.3 开始,这相当于
os.chdir(fd)
。
- os.getcwd()
- 返回一个表示当前工作目录的字符串。
- os.getcwdb()
返回表示当前工作目录的字节串。
3.8 版更改: 该函数现在在 Windows 上使用 UTF-8 编码,而不是 ANSI 代码页:请参阅 PEP 529 了解基本原理。 该函数在 Windows 上不再被弃用。
- os.lchflags(path, flags)
将 path 的标志设置为数字 flags,如 chflags(),但不要遵循符号链接。 从 Python 3.3 开始,这相当于
os.chflags(path, flags, follow_symlinks=False)
。3.6 版更改: 接受 类路径对象 。
- os.lchmod(path, mode)
将 path 的模式更改为数字 mode。 如果 path 是一个符号链接,这会影响符号链接而不是目标。 有关 mode 的可能值,请参阅 chmod() 的文档。 从 Python 3.3 开始,这相当于
os.chmod(path, mode, follow_symlinks=False)
。3.6 版更改: 接受 类路径对象 。
- os.lchown(path, uid, gid)
将 path 的所有者和组 ID 更改为数字 uid 和 gid。 此函数不会遵循符号链接。 从 Python 3.3 开始,这相当于
os.chown(path, uid, gid, follow_symlinks=False)
。3.6 版更改: 接受 类路径对象 。
- os.link(src, dst, *, src_dir_fd=None, dst_dir_fd=None, follow_symlinks=True)
创建一个指向 src 的硬链接,命名为 dst。
此函数可以支持指定 src_dir_fd 和/或 dst_dir_fd 以提供相对于目录描述符 的 路径,以及 不遵循符号链接 。
3.2 版更改: 添加了 Windows 支持。
3.3 新功能: 添加了 src_dir_fd、dst_dir_fd 和 follow_symlinks 参数。
3.6 版更改: 接受 src 和 dst 的 类路径对象 。
- os.listdir(path='.')
返回一个列表,其中包含 path 给出的目录中的条目名称。 该列表按任意顺序排列,不包括特殊条目
'.'
和'..'
,即使它们存在于目录中。 如果在调用此函数期间从目录中删除或添加文件,则未指定是否包含该文件的名称。path 可能是一个 path-like object。 如果 path 是
bytes
类型(直接或间接通过 PathLike 接口),则返回的文件名也将是bytes
类型; 在所有其他情况下,它们的类型为str
。该函数还可以支持指定文件描述符; 文件描述符必须指向一个目录。
笔记
要将
str
文件名编码为bytes
,请使用 fsencode()。也可以看看
scandir() 函数返回目录条目以及文件属性信息,为许多常见用例提供更好的性能。
3.2 版更改: path 参数变为可选。
3.3 版新功能: 添加了对指定 路径 作为打开文件描述符的支持。
3.6 版更改: 接受 类路径对象 。
- os.lstat(path, *, dir_fd=None)
在给定路径上执行等效于
lstat()
系统调用。 类似于 stat(),但不遵循符号链接。 返回一个 stat_result 对象。在不支持符号链接的平台上,这是 stat() 的别名。
从 Python 3.3 开始,这相当于
os.stat(path, dir_fd=dir_fd, follow_symlinks=False)
。此函数还可以支持相对于目录描述符 的 路径。
也可以看看
stat() 函数。
3.2 版更改: 添加了对 Windows 6.0 (Vista) 符号链接的支持。
3.3 版更改: 添加 dir_fd 参数。
3.6 版更改: 接受 类路径对象 。
3.8 版更改: 在 Windows 上,现在打开表示另一个路径(名称代理)的重解析点,包括符号链接和目录连接。 其他类型的重解析点由操作系统解析为 stat()。
- os.mkdir(path, mode=0o777, *, dir_fd=None)
创建一个名为 path 的目录,数字模式为 mode。
如果目录已存在,则引发 FileExistsError。
在某些系统上,mode 被忽略。 在使用它的地方,首先屏蔽掉当前的 umask 值。 如果不是最后 9 位(即 mode) 的八进制表示的最后 3 位数字已设置,其含义取决于平台。 在某些平台上,它们会被忽略,您应该显式调用 chmod() 来设置它们。
此函数还可以支持相对于目录描述符 的 路径。
也可以创建临时目录; 参见 tempfile 模块的 tempfile.mkdtemp() 函数。
3.3 版新功能:dir_fd 参数。
3.6 版更改: 接受 类路径对象 。
- os.makedirs(name, mode=0o777, exist_ok=False)
递归目录创建功能。 与 mkdir() 类似,但需要包含叶目录的所有中间级目录。
mode 参数传递给 mkdir() 用于创建叶目录; 请参阅 mkdir() 描述 了解它是如何解释的。 要设置任何新创建的父目录的文件权限位,您可以在调用 makedirs() 之前设置 umask。 现有父目录的文件权限位不会更改。
如果 exist_ok 是
False
(默认值),如果目标目录已经存在,则会引发 FileExistsError。笔记
makedirs() 如果要创建的路径元素包含 pardir(例如 “..”在 UNIX 系统上)。
此函数正确处理 UNC 路径。
3.2 新功能: exist_ok 参数。
3.4.1 版本变更: 在 Python 3.4.1 之前,如果 exist_ok 是
True
并且目录存在,makedirs() 仍然会如果 mode 与现有目录的模式不匹配,则会引发错误。 由于此行为无法安全实现,因此在 Python 3.4.1 中将其删除。 参见 :issue:`21082`。3.6 版更改: 接受 类路径对象 。
3.7 版更改: mode 参数不再影响新创建的中级目录的文件权限位。
- os.mkfifo(path, mode=0o666, *, dir_fd=None)
使用数字模式 模式 创建一个名为 path 的 FIFO(命名管道)。 当前 umask 值首先从模式中屏蔽掉。
此函数还可以支持相对于目录描述符 的 路径。
FIFO 是可以像常规文件一样访问的管道。 FIFO 一直存在,直到它们被删除(例如使用 os.unlink())。 通常,FIFO 用作“客户端”和“服务器”类型进程之间的集合点:服务器打开 FIFO 进行读取,客户端打开它进行写入。 请注意, mkfifo() 不会打开 FIFO — 它只是创建集合点。
3.3 版新功能:dir_fd 参数。
3.6 版更改: 接受 类路径对象 。
- os.mknod(path, mode=0o600, device=0, *, dir_fd=None)
创建一个名为 path 的文件系统节点(文件、设备专用文件或命名管道)。 mode 指定要使用的权限和要创建的节点类型,与
stat.S_IFREG
、stat.S_IFCHR
、stat.S_IFBLK
之一组合(按位或) ] 和stat.S_IFIFO
(这些常数在 stat 中可用)。 对于stat.S_IFCHR
和stat.S_IFBLK
,device定义了新创建的设备专用文件(可能使用os.makedev()),否则被忽略。此函数还可以支持相对于目录描述符 的 路径。
3.3 版新功能:dir_fd 参数。
3.6 版更改: 接受 类路径对象 。
- os.major(device)
- 从原始设备号中提取设备主号(通常是
stat
中的st_dev
或st_rdev
字段)。
- os.minor(device)
- 从原始设备编号中提取设备次要编号(通常是
stat
中的st_dev
或st_rdev
字段)。
- os.makedev(major, minor)
- 从主设备号和次设备号组成一个原始设备号。
- os.pathconf(path, name)
返回与命名文件相关的系统配置信息。 name 指定要检索的配置值; 它可能是一个字符串,它是定义的系统值的名称; 这些名称在许多标准(POSIX.1、Unix 95、Unix 98 等)中都有规定。 一些平台还定义了其他名称。 主机操作系统已知的名称在
pathconf_names
字典中给出。 对于未包含在该映射中的配置变量,也接受为 name 传递整数。如果 name 是一个字符串并且未知,则会引发 ValueError。 如果主机系统不支持 name 的特定值,即使它包含在
pathconf_names
中,也会引发 OSError 和 errno.EINVAL 为错误编号。该函数可以支持指定文件描述符。
3.6 版更改: 接受 类路径对象 。
- os.pathconf_names
- pathconf() 和 fpathconf() 接受的字典映射名称到主机操作系统为这些名称定义的整数值。 这可用于确定系统已知的名称集。
- os.readlink(path, *, dir_fd=None)
返回一个字符串,表示符号链接指向的路径。 结果可能是绝对或相对路径名; 如果是相对的,则可以使用
os.path.join(os.path.dirname(path), result)
将其转换为绝对路径名。如果 path 是一个字符串对象(直接或间接通过 PathLike 接口),结果也将是一个字符串对象,并且调用可能会引发 UnicodeDecodeError。 如果 path 是字节对象(直接或间接),则结果将是字节对象。
此函数还可以支持相对于目录描述符 的 路径。
尝试解析可能包含链接的路径时,请使用 realpath() 正确处理递归和平台差异。
3.2 版更改: 添加了对 Windows 6.0 (Vista) 符号链接的支持。
3.3 版新功能:dir_fd 参数。
在 3.6 版更改: 在 Unix 上接受 类路径对象 。
3.8 版更改: 在 Windows 上接受 类路径对象 和字节对象。
3.8 版更改: 添加了对目录连接的支持,并更改为返回替换路径(通常包括
\\?\
前缀)而不是之前返回的可选“打印名称”字段。
- os.remove(path, *, dir_fd=None)
移除(删除)文件 path。 如果 path 是目录,则会引发 IsADirectoryError。 使用 rmdir() 删除目录。 如果文件不存在,则会引发 FileNotFoundError。
该函数可以支持相对于目录描述符的路径。
在 Windows 上,尝试删除正在使用的文件会导致引发异常; 在 Unix 上,目录条目被删除,但分配给文件的存储在原始文件不再使用之前不可用。
此函数在语义上与 unlink() 相同。
3.3 版新功能:dir_fd 参数。
3.6 版更改: 接受 类路径对象 。
- os.removedirs(name)
递归删除目录。 像 rmdir() 一样工作,除了如果叶目录被成功删除,removedirs() 会尝试连续删除 path 中提到的每个父目录,直到出现错误被引发(被忽略,因为它通常意味着父目录不为空)。 例如,
os.removedirs('foo/bar/baz')
会先删除目录'foo/bar/baz'
,然后删除'foo/bar'
和'foo'
为空的目录。 如果无法成功删除叶目录,则引发 OSError。3.6 版更改: 接受 类路径对象 。
- os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
将文件或目录 src 重命名为 dst。 如果 dst 存在,则操作将在以下多种情况下失败并显示 OSError 子类:
在 Windows 上,如果 dst 存在,则始终会引发 FileExistsError。
在 Unix 上,如果 src 是一个文件,而 dst 是一个目录,反之亦然,会引发 IsADirectoryError 或 NotADirectoryError分别。 如果两者都是目录并且 dst 为空,则 dst 将被静默替换。 如果 dst 是非空目录,则会引发 OSError。 如果两者都是文件, dst 如果用户有权限,它将被静默替换。 如果 src 和 dst 在不同的文件系统上,操作可能会在某些 Unix 风格上失败。 如果成功,重命名将是一个原子操作(这是 POSIX 要求)。
此函数可以支持指定 src_dir_fd 和/或 dst_dir_fd 以提供相对于目录描述符 的 路径。
如果要跨平台覆盖目标,请使用 replace()。
3.3 版新功能:src_dir_fd 和 dst_dir_fd 参数。
3.6 版更改: 接受 src 和 dst 的 类路径对象 。
- os.renames(old, new)
递归目录或文件重命名功能。 与 rename() 类似,但首先尝试创建使新路径名正确所需的任何中间目录。 重命名后,将使用 removedirs() 删除与旧名称最右侧路径段对应的目录。
笔记
如果您缺乏删除叶目录或文件所需的权限,此功能可能会因新目录结构而失败。
3.6 版更改: 接受 old 和 new 的 类路径对象 。
- os.replace(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
将文件或目录 src 重命名为 dst。 如果 dst 是目录,则会引发 OSError。 如果 dst 存在并且是一个文件,如果用户有权限,它将被静默替换。 如果 src 和 dst 在不同的文件系统上,操作可能会失败。 如果成功,重命名将是一个原子操作(这是 POSIX 要求)。
此函数可以支持指定 src_dir_fd 和/或 dst_dir_fd 以提供相对于目录描述符 的 路径。
3.3 版中的新功能。
3.6 版更改: 接受 src 和 dst 的 类路径对象 。
- os.rmdir(path, *, dir_fd=None)
移除(删除)目录path。 如果目录不存在或不为空,则分别引发 FileNotFoundError 或 OSError。 为了删除整个目录树,可以使用 shutil.rmtree()。
该函数可以支持相对于目录描述符的路径。
3.3 新功能: dir_fd 参数。
3.6 版更改: 接受 类路径对象 。
- os.scandir(path='.')
返回 os.DirEntry 对象的迭代器,对应于 path 给出的目录中的条目。 条目以任意顺序生成,不包括特殊条目
'.'
和'..'
。 如果在创建迭代器后从目录中删除或添加文件,则未指定是否包含该文件的条目。使用 scandir() 代替 listdir() 可以显着提高也需要文件类型或文件属性信息的代码的性能,因为 os.DirEntry 对象公开如果操作系统在扫描目录时提供此信息。 所有 os.DirEntry 方法都可以执行系统调用,但 is_dir() 和 is_file() 通常只需要对符号链接进行系统调用; os.DirEntry.stat() 在 Unix 上总是需要一个系统调用,但在 Windows 上只需要一个符号链接。
path 可能是一个 path-like object。 如果 path 的类型为
bytes
(直接或间接通过 PathLike 接口),则 name 和 path[每个 os.DirEntry 的 X146X] 属性将为bytes
; 在所有其他情况下,它们的类型为str
。该函数还可以支持指定文件描述符; 文件描述符必须指向一个目录。
- scandir.close()
关闭迭代器并释放获取的资源。
当迭代器耗尽或垃圾收集时,或者在迭代过程中发生错误时,会自动调用它。 但是,建议显式调用它或使用 with 语句。
3.6 版中的新功能。
下面的例子展示了一个简单的使用 scandir() 来显示给定 path 中所有不以
'.'
开头的文件(不包括目录)。entry.is_file()
调用通常不会进行额外的系统调用:with os.scandir(path) as it: for entry in it: if not entry.name.startswith('.') and entry.is_file(): print(entry.name)
笔记
在基于 Unix 的系统上,scandir() 使用系统的 opendir() 和 readdir() 函数。 在 Windows 上,它使用 Win32 FindFirstFileW 和 FindNextFileW 函数。
3.5 版中的新功能。
3.6 新功能: 添加了对 上下文管理器 协议和 close() 方法的支持。 如果 scandir() 迭代器既没有耗尽也没有明确关闭,则 ResourceWarning 将在其析构函数中发出。
该函数接受一个path-like object。
3.7 版更改: 在 Unix 上添加了对 文件描述符 的支持。
- class os.DirEntry
scandir() 生成的对象,用于公开目录条目的文件路径和其他文件属性。
scandir() 将提供尽可能多的此类信息,而无需进行额外的系统调用。 当进行
stat()
或lstat()
系统调用时,os.DirEntry
对象将缓存结果。os.DirEntry
实例不打算存储在长期存在的数据结构中; 如果您知道文件元数据已更改或自调用 scandir() 以来已过去很长时间,请调用os.stat(entry.path)
以获取最新信息。因为
os.DirEntry
方法可以进行操作系统调用,所以它们也可能引发 OSError。 如果您需要对错误进行非常细粒度的控制,则可以在调用os.DirEntry
方法之一时捕获 OSError 并进行适当的处理。为了直接用作 类路径对象 ,
os.DirEntry
实现了 PathLike 接口。os.DirEntry
实例的属性和方法如下:- name
条目的基本文件名,相对于 scandir() path 参数。
name 属性将是
bytes
如果 scandir() path 参数是bytes
和 [ X124X] 否则。 使用 fsdecode() 解码字节文件名。
- path
条目的完整路径名:相当于
os.path.join(scandir_path, entry.name)
其中 scandir_path 是 scandir() path 参数。 只有当 scandir() path 参数是绝对的时,路径才是绝对的。 如果 scandir() path 参数是 文件描述符 ,则 path 属性与 name 相同] 属性。path 属性将是
bytes
如果 scandir() path 参数是bytes
和 [ X124X] 否则。 使用 fsdecode() 解码字节文件名。
- inode()
返回条目的 inode 编号。
结果缓存在
os.DirEntry
对象上。 使用os.stat(entry.path, follow_symlinks=False).st_ino
获取最新信息。在第一个未缓存的调用中,在 Windows 上需要系统调用,但在 Unix 上不需要。
- is_dir(*, follow_symlinks=True)
如果此条目是目录或指向目录的符号链接,则返回
True
; 如果条目是或指向任何其他类型的文件,或者它不再存在,则返回False
。如果 follow_symlinks 是
False
,则仅当此条目是目录时才返回True
(不跟随符号链接); 如果条目是任何其他类型的文件或者它不再存在,则返回False
。结果缓存在
os.DirEntry
对象上,并为 follow_symlinksTrue
和False
单独缓存。 调用 os.stat() 和 stat.S_ISDIR() 以获取最新信息。在第一个未缓存的调用中,大多数情况下不需要系统调用。 具体来说,对于非符号链接,Windows 或 Unix 都不需要系统调用,除非在某些 Unix 文件系统(例如网络文件系统)上返回
dirent.d_type == DT_UNKNOWN
。 如果条目是符号链接,则需要系统调用来跟随符号链接,除非 follow_symlinks 是False
。这个方法可以引发OSError,比如PermissionError,但是FileNotFoundError被捕获了,不会被引发。
- is_file(*, follow_symlinks=True)
如果此条目是文件或指向文件的符号链接,则返回
True
; 如果条目是或指向目录或其他非文件条目,或者它不再存在,则返回False
。如果 follow_symlinks 是
False
,则仅当此条目是文件时才返回True
(不跟随符号链接); 如果条目是目录或其他非文件条目,或者它不再存在,则返回False
。结果缓存在
os.DirEntry
对象上。 缓存、系统调用和引发的异常按照 is_dir()。
- is_symlink()
如果此条目是符号链接(即使已损坏),则返回
True
; 如果条目指向目录或任何类型的文件,或者它不再存在,则返回False
。结果缓存在
os.DirEntry
对象上。 调用 os.path.islink() 以获取最新信息。在第一个未缓存的调用中,大多数情况下不需要系统调用。 具体来说,Windows 或 Unix 都不需要系统调用,除非在某些 Unix 文件系统(例如网络文件系统)上返回
dirent.d_type == DT_UNKNOWN
。这个方法可以引发OSError,比如PermissionError,但是FileNotFoundError被捕获了,不会被引发。
- stat(*, follow_symlinks=True)
返回此条目的 stat_result 对象。 默认情况下,此方法遵循符号链接; 要统计符号链接,请添加
follow_symlinks=False
参数。在 Unix 上,此方法始终需要系统调用。 在 Windows 上,如果 follow_symlinks 是
True
并且条目是重新分析点(例如,符号链接或目录连接),它只需要系统调用。在 Windows 上,stat_result 的
st_ino
、st_dev
和st_nlink
属性始终设置为零。 调用 os.stat() 来获取这些属性。结果缓存在
os.DirEntry
对象上,并为 follow_symlinksTrue
和False
单独缓存。 调用 os.stat() 以获取最新信息。
请注意,
os.DirEntry
和 pathlib.Path 的几个属性和方法之间有很好的对应关系。 特别是,name
属性与is_dir()
、is_file()
、is_symlink()
和stat()
方法具有相同的含义。3.5 版中的新功能。
- os.stat(path, *, dir_fd=None, follow_symlinks=True)
获取文件或文件描述符的状态。 在给定路径上执行等效于
stat()
系统调用。 path 可以指定为字符串或字节 - 直接或间接通过 PathLike 接口 - 或作为打开的文件描述符。 返回一个 stat_result 对象。此函数通常遵循符号链接; 要统计符号链接,请添加参数
follow_symlinks=False
,或使用 lstat()。在 Windows 上,传递
follow_symlinks=False
将禁用所有名称代理重解析点,包括符号链接和目录连接。 其他不类似链接或操作系统无法跟踪的重解析点将直接打开。 当跟随多个链接的链时,这可能导致返回原始链接而不是阻止完全遍历的非链接。 这种情况下要获取最终路径的stat结果,尽量使用os.path.realpath()函数解析路径名,调用lstat()结果。 这不适用于悬空符号链接或连接点,它们会引发通常的异常。例子:
>>> import os >>> statinfo = os.stat('somefile.txt') >>> statinfo os.stat_result(st_mode=33188, st_ino=7876932, st_dev=234881026, st_nlink=1, st_uid=501, st_gid=501, st_size=264, st_atime=1297230295, st_mtime=1297230027, st_ctime=1297230027) >>> statinfo.st_size 264
3.3 版新功能: 添加了 dir_fd 和 follow_symlinks 参数,指定文件描述符而不是路径。
3.6 版更改: 接受 类路径对象 。
3.8 版更改: 在 Windows 上,现在遵循操作系统可以解析的所有重解析点,并通过
follow_symlinks=False
禁用跟随所有名称代理重解析点。 如果操作系统到达无法跟踪的重解析点,stat 现在返回原始路径的信息,就好像指定了follow_symlinks=False
而不是引发错误。
- class os.stat_result
其属性大致对应于
stat
结构的成员的对象。 它用于 os.stat()、os.fstat() 和 os.lstat() 的结果。属性:
- st_mode
文件模式:文件类型和文件模式位(权限)。
- st_ino
平台相关,但如果非零,则唯一标识给定值
st_dev
的文件。 通常:Unix 上的 inode 编号,
Windows 上的 文件索引
- st_dev
此文件所在设备的标识符。
- st_nlink
硬链接的数量。
- st_uid
文件所有者的用户标识符。
- st_gid
文件所有者的组标识符。
- st_size
文件的大小(以字节为单位),如果它是常规文件或符号链接。 符号链接的大小是它包含的路径名的长度,没有终止的空字节。
时间戳:
- st_atime
最近访问的时间以秒表示。
- st_mtime
以秒表示的最近内容修改的时间。
- st_ctime
平台相关:
Unix 上最近一次元数据更改的时间,
在 Windows 上创建的时间,以秒表示。
- st_atime_ns
最近访问的时间,以纳秒为单位表示为整数。
- st_mtime_ns
最近内容修改的时间,以纳秒表示为整数。
- st_ctime_ns
平台相关:
Unix 上最近一次元数据更改的时间,
Windows 上的创建时间,以纳秒为单位表示为整数。
笔记
st_atime、st_mtime和st_ctime属性的确切含义和解析取决于操作系统和文件系统。 例如,在使用 FAT 或 FAT32 文件系统的 Windows 系统上,st_mtime 的分辨率为 2 秒,而 st_atime 的分辨率仅为 1 天。 有关详细信息,请参阅您的操作系统文档。
同样,尽管 st_atime_ns、st_mtime_ns 和 st_ctime_ns 总是以纳秒表示,但许多系统不提供纳秒精度。 在提供纳秒精度的系统上,用于存储 st_atime、st_mtime 和 st_ctime 的浮点对象不能保留所有这些,因此将有点不准确。 如果您需要确切的时间戳,则应始终使用 st_atime_ns、st_mtime_ns 和 st_ctime_ns。
在某些 Unix 系统(例如 Linux)上,以下属性也可能可用:
- st_blocks
为文件分配的 512 字节块数。 当文件有孔时,这可能小于 st_size/512。
- st_blksize
用于高效文件系统 I/O 的“首选”块大小。 以较小的块写入文件可能会导致读取-修改-重写效率低下。
- st_rdev
设备类型(如果是 inode 设备)。
- st_flags
用户定义的文件标志。
在其他 Unix 系统(例如 FreeBSD)上,以下属性可能可用(但只有在 root 尝试使用它们时才可能填写):
- st_gen
文件生成编号。
- st_birthtime
文件创建时间。
在 Solaris 和衍生产品上,以下属性也可能可用:
- st_fstype
唯一标识包含文件的文件系统类型的字符串。
在 macOS 系统上,以下属性也可能可用:
- st_rsize
文件的实际大小。
- st_creator
文件的创建者。
- st_type
文件类型。
在 Windows 系统上,还可以使用以下属性:
- st_file_attributes
Windows 文件属性:
GetFileInformationByHandle()
返回的BY_HANDLE_FILE_INFORMATION
结构的dwFileAttributes
成员。 请参阅 stat 模块中的FILE_ATTRIBUTE_*
常量。
- st_reparse_tag
当 st_file_attributes 设置了
FILE_ATTRIBUTE_REPARSE_POINT
时,该字段包含标识重解析点类型的标签。 请参阅 stat 模块中的IO_REPARSE_TAG_*
常量。
标准模块 stat 定义了用于从
stat
结构中提取信息的函数和常量。 (在 Windows 上,某些项目填充了虚拟值。)为了向后兼容,stat_result 实例也可以作为至少 10 个整数的元组访问,给出
stat
结构的最重要(和可移植)成员,顺序为 st_mode 、st_ino、st_dev、st_nlink、st_uid、st_gid[X30X30X30X30X] ]、st_atime、st_mtime、st_ctime。 一些实现可能会在最后添加更多项目。 为了与较旧的 Python 版本兼容,将 stat_result 作为元组访问总是返回整数。3.3 新功能: 添加了 st_atime_ns、st_mtime_ns 和 st_ctime_ns 成员。
3.5 新功能: 在 Windows 上添加了 st_file_attributes 成员。
在 3.5 版更改:Windows 现在在可用时将文件索引返回为 st_ino。
3.7 版新功能: 向 Solaris/衍生品添加 st_fstype 成员。
3.8 新功能: 在 Windows 上添加了 st_reparse_tag 成员。
3.8 版更改: 在 Windows 上,st_mode 成员现在根据需要将特殊文件标识为
S_IFCHR
、S_IFIFO
或S_IFBLK
.
- os.statvfs(path)
在给定路径上执行
statvfs()
系统调用。 返回值是一个对象,其属性描述给定路径上的文件系统,并对应于statvfs
结构的成员,即:f_bsize
,f_frsize
,f_blocks
、f_bfree
、f_bavail
、f_files
、f_ffree
、f_favail
、f_flag
X262X]、f_fsid
。为
f_flag
属性的位标志定义了两个模块级常量:如果设置了ST_RDONLY
,则文件系统以只读方式挂载,如果设置了ST_NOSUID
,则禁用或不支持 setuid/setgid 位的语义。为基于 GNU/glibc 的系统定义了额外的模块级常量。 它们是
ST_NODEV
(禁止访问设备特殊文件)、ST_NOEXEC
(禁止程序执行)、ST_SYNCHRONOUS
(一次同步写入)、ST_MANDLOCK
(允许强制锁定 FS)、ST_WRITE
(在文件/目录/符号链接上写入)、ST_APPEND
(仅附加文件)、ST_IMMUTABLE
(不可变文件)、[X289X ](不更新访问次数)、ST_NODIRATIME
(不更新目录访问次数)、ST_RELATIME
(相对于 mtime/ctime 更新 atime)。该函数可以支持指定文件描述符。
3.2 版更改: 添加了
ST_RDONLY
和ST_NOSUID
常量。3.3 版新功能: 添加了对指定 路径 作为打开文件描述符的支持。
3.4 版本变更:
ST_NODEV
、ST_NOEXEC
、ST_SYNCHRONOUS
、ST_MANDLOCK
、ST_WRITE
、ST_APPEND
、ST_IMMUTABLE
、ST_NOATIME
、ST_NODIRATIME
和ST_RELATIME
常数。3.6 版更改: 接受 类路径对象 。
3.7 新功能:新增
f_fsid
。
- os.supports_dir_fd
set 对象指示 os 模块中的哪些函数接受其 dir_fd 参数的打开文件描述符。 不同的平台提供不同的功能,Python 用于实现 dir_fd 参数的底层功能并非在 Python 支持的所有平台上都可用。 为了一致性,可能支持 dir_fd 的函数总是允许指定参数,但如果在本地不可用时使用该功能,则会抛出异常。 (在所有平台上始终支持为 dir_fd 指定
None
。)要检查特定函数是否接受其 dir_fd 参数的打开文件描述符,请在
supports_dir_fd
上使用in
运算符。 例如,如果 os.stat() 接受本地平台上 dir_fd 的打开文件描述符,则此表达式的计算结果为True
:os.stat in os.supports_dir_fd
目前 dir_fd 参数仅适用于 Unix 平台; 它们都不适用于 Windows。
3.3 版中的新功能。
- os.supports_effective_ids
一个 set 对象,指示 os.access() 是否允许在本地平台上为其 effective_ids 参数指定
True
。 (指定False
为 effective_ids 始终支持所有平台。)如果本地平台支持,则集合将包含 os.access(); 否则它将是空的。如果 os.access() 在本地平台上支持
effective_ids=True
,则此表达式的计算结果为True
:os.access in os.supports_effective_ids
目前 Effective_ids 仅在 Unix 平台上支持; 它不适用于 Windows。
3.3 版中的新功能。
- os.supports_fd
set 对象指示 os 模块中的哪些函数允许将其 path 参数指定为本地平台上的打开文件描述符。 不同的平台提供不同的功能,Python 用于接受打开文件描述符作为 path 参数的底层功能并非在 Python 支持的所有平台上都可用。
要确定特定函数是否允许为其 path 参数指定打开的文件描述符,请在
supports_fd
上使用in
运算符。 例如,如果 os.chdir() 接受本地平台上 path 的打开文件描述符,则此表达式的计算结果为True
:os.chdir in os.supports_fd
3.3 版中的新功能。
- os.supports_follow_symlinks
set 对象指示 os 模块中的哪些函数在本地平台上接受
False
作为其 follow_symlinks 参数。 不同的平台提供不同的功能,Python 用于实现 follow_symlinks 的底层功能并非在 Python 支持的所有平台上都可用。 为保持一致性,可能支持 follow_symlinks 的函数始终允许指定参数,但如果在本地不可用时使用该功能,则会抛出异常。 (为 follow_symlinks 指定True
在所有平台上始终受支持。)要检查特定函数是否为其 follow_symlinks 参数接受
False
,请使用supports_follow_symlinks
上的in
运算符。 例如,如果您在本地平台上调用 os.stat() 时可以指定follow_symlinks=False
,则此表达式的计算结果为True
:os.stat in os.supports_follow_symlinks
3.3 版中的新功能。
- os.symlink(src, dst, target_is_directory=False, *, dir_fd=None)
创建一个指向 src 的符号链接,名为 dst。
在 Windows 上,符号链接表示文件或目录,并且不会动态地变形为目标。 如果目标存在,将创建符号链接的类型以匹配。 否则,如果 target_is_directory 是
True
或文件符号链接(默认值),则符号链接将被创建为目录。 在非 Windows 平台上,target_is_directory 被忽略。该函数可以支持相对于目录描述符的路径。
笔记
在较新版本的 Windows 10 上,如果启用了开发人员模式,则非特权帐户可以创建符号链接。 当开发者模式不可用/启用时,需要 SeCreateSymbolicLinkPrivilege 权限,或者必须以管理员身份运行该进程。
OSError 当函数被非特权用户调用时引发。
3.2 版更改: 添加了对 Windows 6.0 (Vista) 符号链接的支持。
3.3 新功能: 添加了 dir_fd 参数,现在允许在非 Windows 平台上使用 target_is_directory。
3.6 版更改: 接受 src 和 dst 的 类路径对象 。
3.8 版更改: 在开发人员模式下添加了对 Windows 上未提升的符号链接的支持。
- os.sync()
强制将所有内容写入磁盘。
3.3 版中的新功能。
- os.truncate(path, length)
截断path对应的文件,使其大小最多为length个字节。
该函数可以支持指定文件描述符。
3.3 版中的新功能。
3.5 版更改: 增加了对 Windows 的支持
3.6 版更改: 接受 类路径对象 。
- os.unlink(path, *, dir_fd=None)
移除(删除)文件 path。 这个函数在语义上等同于 remove();
unlink
名称是其传统的 Unix 名称。 有关更多信息,请参阅 remove() 的文档。3.3 新功能: dir_fd 参数。
3.6 版更改: 接受 类路径对象 。
- os.utime(path, times=None, *, [ns, ]dir_fd=None, follow_symlinks=True)
设置path指定文件的访问和修改次数。
utime() 有两个可选参数,times 和 ns。 这些指定在 路径 上设置的时间,并按如下方式使用:
如果指定了 ns,则它必须是
(atime_ns, mtime_ns)
形式的 2 元组,其中每个成员都是一个表示纳秒的 int。如果 times 不是
None
,则它必须是(atime, mtime)
形式的 2 元组,其中每个成员都是一个 int 或 float 表示秒。如果 times 是
None
并且 ns 未指定,则这等效于指定ns=(atime_ns, mtime_ns)
,其中两个时间都是当前时间。
为 times 和 ns 指定元组是错误的。
请注意,您在此处设置的确切时间可能不会被后续的 stat() 调用返回,具体取决于您的操作系统记录访问和修改时间的分辨率; 参见 stat()。 保留精确时间的最佳方法是将 os.stat() 结果对象中的 st_atime_ns 和 st_mtime_ns 字段与 ns ] 参数到 utime。
此函数可以支持 指定文件描述符 、相对于目录描述符的 路径 和 不遵循符号链接 。
3.3 版新功能: 添加了对指定 path 作为打开文件描述符的支持,以及 dir_fd、follow_symlinks 和 ns 参数。
3.6 版更改: 接受 类路径对象 。
- os.walk(top, topdown=True, onerror=None, followlinks=False)
通过自顶向下或自底向上遍历树来生成目录树中的文件名。 对于以目录 top 为根的树中的每个目录(包括 top 本身),它产生一个 3 元组
(dirpath, dirnames, filenames)
。dirpath 是一个字符串,目录的路径。 dirnames 是 dirpath 中子目录的名称列表(不包括
'.'
和'..'
)。 filenames 是 dirpath 中非目录文件的名称列表。 请注意,列表中的名称不包含路径组件。 要获取到 dirpath 中的文件或目录的完整路径(以 top 开头),请执行os.path.join(dirpath, name)
。 列表是否排序取决于文件系统。 如果在生成列表期间从 dirpath 目录中删除或添加文件,则未指定是否包含该文件的名称。如果可选参数 topdown 是
True
或未指定,则目录的三元组在其任何子目录的三元组之前生成(目录自上而下生成)。 如果 topdown 是False
,则目录的三元组在其所有子目录的三元组之后生成(目录自下而上生成)。 无论 topdown 的值如何,在生成目录及其子目录的元组之前,都会检索子目录列表。当 topdown 为
True
时,调用者可以就地修改 dirnames 列表(可能使用 del 或切片分配),以及 ]walk() 只会递归到名称保留在 dirnames 中的子目录; 这可用于修剪搜索,施加特定的访问顺序,甚至通知 walk() 调用者在再次恢复 walk() 之前创建或重命名的目录。 当 topdown 为False
时修改 dirnames 对步行的行为没有影响,因为在自底向上模式下 dirnames 中的目录是在生成 dirpath 本身之前生成。默认情况下,会忽略来自 scandir() 调用的错误。 如果指定了可选参数 onerror,则它应该是一个函数; 它将用一个参数调用,一个 OSError 实例。 它可以报告错误以继续执行,或引发异常以中止执行。 请注意,文件名可用作异常对象的
filename
属性。默认情况下, walk() 不会进入解析为目录的符号链接。 在支持符号链接的系统上,将 followlinks 设置为
True
以访问符号链接指向的目录。笔记
请注意,如果链接指向自身的父目录,将 followlinks 设置为
True
会导致无限递归。 walk() 不会跟踪它已经访问过的目录。这个例子显示了起始目录下每个目录中非目录文件占用的字节数,除了它没有在任何 CVS 子目录下查找:
import os from os.path import join, getsize for root, dirs, files in os.walk('python/Lib/email'): print(root, "consumes", end=" ") print(sum(getsize(join(root, name)) for name in files), end=" ") print("bytes in", len(files), "non-directory files") if 'CVS' in dirs: dirs.remove('CVS') # don't visit CVS directories
在下一个示例中(shutil.rmtree() 的简单实现),自底向上遍历树是必不可少的,rmdir() 不允许在目录被删除之前删除目录空的:
# Delete everything reachable from the directory named in "top", # assuming there are no symbolic links. # CAUTION: This is dangerous! For example, if top == '/', it # could delete all your disk files. import os for root, dirs, files in os.walk(top, topdown=False): for name in files: os.remove(os.path.join(root, name)) for name in dirs: os.rmdir(os.path.join(root, name))
3.5 版更改: 该函数现在调用 os.scandir() 而不是 os.listdir(),通过减少调用次数使其更快os.stat()。
3.6 版更改: 接受 类路径对象 。
- os.fwalk(top='.', topdown=True, onerror=None, *, follow_symlinks=False, dir_fd=None)
它的行为与 walk() 完全一样,除了它产生一个 4 元组
(dirpath, dirnames, filenames, dirfd)
,并且它支持dir_fd
。dirpath, dirnames 和 filenames 与 walk() 输出相同,dirfd 是一个文件描述符,引用到目录 dirpath。
此函数始终支持相对于目录描述符 和 不遵循符号链接 的 路径。 但是请注意,与其他函数不同,follow_symlinks 的 fwalk() 默认值为
False
。这个例子显示了起始目录下每个目录中非目录文件占用的字节数,除了它没有在任何 CVS 子目录下查找:
import os for root, dirs, files, rootfd in os.fwalk('python/Lib/email'): print(root, "consumes", end="") print(sum([os.stat(name, dir_fd=rootfd).st_size for name in files]), end="") print("bytes in", len(files), "non-directory files") if 'CVS' in dirs: dirs.remove('CVS') # don't visit CVS directories
在下一个示例中,自底向上遍历树是必不可少的: rmdir() 不允许在目录为空之前删除目录:
# Delete everything reachable from the directory named in "top", # assuming there are no symbolic links. # CAUTION: This is dangerous! For example, if top == '/', it # could delete all your disk files. import os for root, dirs, files, rootfd in os.fwalk(top, topdown=False): for name in files: os.unlink(name, dir_fd=rootfd) for name in dirs: os.rmdir(name, dir_fd=rootfd)
3.3 版中的新功能。
3.6 版更改: 接受 类路径对象 。
3.7 版更改: 添加了对 字节 路径的支持。
- os.memfd_create(name[, flags=os.MFD_CLOEXEC])
创建一个匿名文件并返回引用它的文件描述符。 flags 必须是系统上可用的
os.MFD_*
常量之一(或它们的按位或组合)。 默认情况下,新的文件描述符是 不可继承的 。name 中提供的名称用作文件名,并将显示为目录
/proc/self/fd/
中相应符号链接的目标。 显示的名称总是以memfd:
为前缀,仅用于调试目的。 名称不会影响文件描述符的行为,因此多个文件可以具有相同的名称而不会产生任何副作用。3.8 版中的新功能。
- os.MFD_CLOEXEC
os.MFD_ALLOW_SEALING
os.MFD_HUGETLB
os.MFD_HUGE_SHIFT
os.MFD_HUGE_MASK
os.MFD_HUGE_64KB
os.MFD_HUGE_512KB
os.MFD_HUGE_1MB
os.MFD_HUGE_2MB
os.MFD_HUGE_8MB
os.MFD_HUGE_16MB
os.MFD_HUGE_32MB
os.MFD_HUGE_256MB
os.MFD_HUGE_512MB
os.MFD_HUGE_1GB
os.MFD_HUGE_2GB
os.MFD_HUGE_16GB 这些标志可以传递给 memfd_create()。
3.8 版中的新功能。
Linux 扩展属性
3.3 版中的新功能。
这些功能都只在 Linux 上可用。
- os.getxattr(path, attribute, *, follow_symlinks=True)
返回 path 的扩展文件系统属性 attribute 的值。 属性 可以是字节或字符串(直接或间接通过 PathLike 接口)。 如果是 str,则使用文件系统编码对其进行编码。
3.6 版更改: 接受 路径 和 属性 的 类路径对象 。
- os.listxattr(path=None, *, follow_symlinks=True)
返回 路径 上的扩展文件系统属性列表。 列表中的属性表示为使用文件系统编码解码的字符串。 如果 path 是
None
,listxattr() 将检查当前目录。3.6 版更改: 接受 类路径对象 。
- os.removexattr(path, attribute, *, follow_symlinks=True)
从 path 中删除扩展文件系统属性 attribute。 attribute 应该是 bytes 或 str (直接或间接通过 PathLike 接口)。 如果是字符串,则使用文件系统编码对其进行编码。
3.6 版更改: 接受 路径 和 属性 的 类路径对象 。
- os.setxattr(path, attribute, value, flags=0, *, follow_symlinks=True)
将 path 上的扩展文件系统属性 attribute 设置为 value。 attribute 必须是没有嵌入 NUL 的字节或 str(直接或间接通过 PathLike 接口)。 如果是 str,则使用文件系统编码对其进行编码。 flags 可以是 XATTR_REPLACE 或 XATTR_CREATE。 如果给出 XATTR_REPLACE 并且该属性不存在,则将引发
ENODATA
。 如果给出 XATTR_CREATE 并且该属性已经存在,则不会创建该属性并且会引发EEXISTS
。笔记
低于 2.6.39 的 Linux 内核版本中的错误导致 flags 参数在某些文件系统上被忽略。
3.6 版更改: 接受 路径 和 属性 的 类路径对象 。
- os.XATTR_SIZE_MAX
- 扩展属性值的最大大小。 目前,这是 Linux 上的 64 KiB。
- os.XATTR_CREATE
- 这是 setxattr() 中 flags 参数的可能值。 它指示操作必须创建一个属性。
- os.XATTR_REPLACE
- 这是 setxattr() 中 flags 参数的可能值。 它指示操作必须替换现有属性。
流程管理
这些功能可用于创建和管理流程。
各种 exec* 函数获取加载到进程中的新程序的参数列表。 在每种情况下,这些参数中的第一个作为它自己的名称传递给新程序,而不是作为用户可能在命令行上键入的参数。 对于 C 程序员来说,这是传递给程序的 main()
的 argv[0]
。 例如,os.execv('/bin/echo', ['foo', 'bar'])
只会在标准输出上打印 bar
; foo
似乎会被忽略。
- os.abort()
- 为当前进程生成
SIGABRT
信号。 在 Unix 上,默认行为是生成核心转储; 在 Windows 上,进程会立即返回退出代码3
。 请注意,调用此函数不会使用 signal.signal() 调用为SIGABRT
注册的 Python 信号处理程序。
- os.add_dll_directory(path)
添加到 DLL 搜索路径的路径。
在解析导入的扩展模块的依赖项时使用此搜索路径(模块本身通过 sys.path 解析),也用于 ctypes。
通过对返回的对象调用 close() 或在 with 语句中使用它来删除目录。
有关如何加载 DLL 的更多信息,请参阅 Microsoft 文档 。
3.8 版新功能: 以前版本的 CPython 将使用当前进程的默认行为来解析 DLL。 这导致不一致,例如有时只搜索
PATH
或当前工作目录,而AddDllDirectory
等操作系统功能无效。在 3.8 中,加载 DLL 的两种主要方式现在显式覆盖进程范围的行为以确保一致性。 有关更新库的信息,请参阅 移植说明 。
- os.execl(path, arg0, arg1, ...)
os.execle(path, arg0, arg1, ..., env)
os.execlp(file, arg0, arg1, ...)
os.execlpe(file, arg0, arg1, ..., env)
os.execv(path, args)
os.execve(path, args, env)
os.execvp(file, args)
os.execvpe(file, args, env) 这些函数都执行一个新的程序,替换当前的进程; 他们不回来。 在 Unix 上,新的可执行文件被加载到当前进程中,并且与调用者具有相同的进程 ID。 错误将报告为 OSError 异常。
当前进程立即被替换。 打开的文件对象和描述符不会被刷新,所以如果这些打开的文件上可能有缓冲的数据,你应该在调用 之前使用
sys.stdout.flush()
或 os.fsync() 刷新它们exec* 函数。exec* 函数的“l”和“v”变体在命令行参数的传递方式上有所不同。 如果在编写代码时参数数量是固定的,那么“l”变体可能是最容易使用的; 单个参数只是成为
execl*()
功能的附加参数。 当参数数量可变时,“v”变体很好,参数在列表或元组中作为 args 参数传递。 在任何一种情况下,子进程的参数都应该以正在运行的命令的名称开头,但这不是强制执行的。包括末尾附近的“p”的变体(execlp()、execlpe()、execvp() 和 execvpe()[ X122X]) 将使用
PATH
环境变量来定位程序 文件 。 当环境被替换时(使用 exec*e 变体之一,将在下一段讨论),新环境用作PATH
的源] 多变的。 其他变体 execl()、execle()、execv() 和 execve(),将不使用 [ X123X]PATH
变量来定位可执行文件; path 必须包含适当的绝对或相对路径。对于 execle()、execlpe()、execve() 和 execvpe()(注意这些都以“e”结尾”),env 参数必须是一个映射,用于定义新进程的环境变量(这些用于代替当前进程的环境); 函数 execl()、execlp()、execv() 和 execvp() 都会导致新进程继承当前进程的环境。
对于某些平台上的 execve(),也可以将 path 指定为打开的文件描述符。 您的平台可能不支持此功能; 您可以使用 os.supports_fd 检查它是否可用。 如果它不可用,使用它会引发 NotImplementedError。
3.3 版新功能: 添加了对指定 path 作为 execve() 的打开文件描述符的支持。
3.6 版更改: 接受 类路径对象 。
- os._exit(n)
以状态 n 退出进程,无需调用清理处理程序、刷新 stdio 缓冲区等。
以下退出代码已定义并可与 _exit() 一起使用,尽管它们不是必需的。 这些通常用于用 Python 编写的系统程序,例如邮件服务器的外部命令传递程序。
笔记
其中一些可能并非在所有 Unix 平台上都可用,因为存在一些变化。 这些常量是在底层平台定义的地方定义的。
- os.EX_OK
- 退出代码表示没有发生错误。
- os.EX_USAGE
- 退出代码表示命令使用不正确,例如给出了错误数量的参数。
- os.EX_DATAERR
- 退出代码表示输入数据不正确。
- os.EX_NOINPUT
- 退出代码表示输入文件不存在或不可读。
- os.EX_NOUSER
- 退出代码表示指定的用户不存在。
- os.EX_NOHOST
- 退出代码表示指定的主机不存在。
- os.EX_UNAVAILABLE
- 退出代码表示所需的服务不可用。
- os.EX_SOFTWARE
- 退出代码表示检测到内部软件错误。
- os.EX_OSERR
- 退出代码表示检测到操作系统错误,例如无法分叉或创建管道。
- os.EX_OSFILE
- 退出代码表示某些系统文件不存在、无法打开或出现其他类型的错误。
- os.EX_CANTCREAT
- 退出代码表示无法创建用户指定的输出文件。
- os.EX_IOERR
- 退出代码表示在对某个文件执行 I/O 时发生错误。
- os.EX_TEMPFAIL
- 退出代码表示发生了临时故障。 这表示某些可能不是真正错误的事情,例如在可重试操作期间无法建立网络连接。
- os.EX_PROTOCOL
- 退出代码表示协议交换是非法的、无效的或不被理解的。
- os.EX_NOPERM
- 退出代码表示没有足够的权限来执行操作(但不适用于文件系统问题)。
- os.EX_CONFIG
- 退出代码表示发生了某种配置错误。
- os.EX_NOTFOUND
- 退出代码表示“未找到条目”之类的内容。
- os.fork()
Fork 一个子进程。 在子进程中返回
0
,在父进程中返回子进程 ID。 如果发生错误 OSError 被引发。请注意,包括 FreeBSD <= 6.3 和 Cygwin 在内的一些平台在使用时存在已知问题
fork()
从一个线程。在 3.8 版中更改:不再支持在子解释器中调用
fork()
(RuntimeError 被引发)。警告
有关使用带有 fork() 的 SSL 模块的应用程序,请参阅 ssl。
- os.forkpty()
Fork 一个子进程,使用一个新的伪终端作为子进程的控制终端。 返回一对
(pid, fd)
,其中pid为子进程中的0
,父进程中新子进程的id,fd为文件伪终端主端的描述符。 要获得更便携的方法,请使用 pty 模块。 如果发生错误 OSError 被引发。在 3.8 版中更改:不再支持在子解释器中调用
forkpty()
(RuntimeError 被引发)。
- os.kill(pid, sig)
发送信号sig给进程pid。 主机平台上可用的特定信号的常数在 信号 模块中定义。
Windows: signal.CTRL_C_EVENT 和 signal.CTRL_BREAK_EVENT 信号是特殊信号,只能发送到共享一个公共控制台窗口的控制台进程,例如某些子进程。 sig 的任何其他值都会导致进程被 TerminateProcess API 无条件终止,并且退出代码将设置为 sig。 kill() 的 Windows 版本另外需要杀死进程句柄。
3.2 新功能:Windows 支持。
- os.killpg(pgid, sig)
- 将信号sig发送到进程组pgid。
- os.nice(increment)
- 将 increment 添加到进程的“niceness”。 回归新的美好。
- os.pidfd_open(pid, flags=0)
返回引用进程 pid 的文件描述符。 该描述符可用于在没有竞争和信号的情况下执行进程管理。 flags 参数是为将来的扩展提供的; 当前没有定义标志值。
有关更多详细信息,请参阅 pidfd_open(2) 手册页。
3.9 版中的新功能。
- os.plock(op)
- 将程序段锁定到内存中。 op(在
<sys/lock.h>
中定义)的值决定了哪些段被锁定。
- os.popen(cmd, mode='r', buffering=- 1)
打开与命令 cmd 之间的管道。 返回值是一个连接到管道的打开文件对象,可以根据 mode 是
'r'
(默认)还是'w'
来读取或写入。 buffering 参数与内置 open() 函数的相应参数含义相同。 返回的文件对象读取或写入文本字符串而不是字节。如果子进程成功退出,则
close
方法返回 None,如果出现错误,则返回子进程的返回码。 在 POSIX 系统上,如果返回码为正,则表示进程的返回值左移一个字节。 如果返回码为负,则进程由返回码的否定值给出的信号终止。 (例如,如果子进程被终止,返回值可能是- signal.SIGKILL
。)在 Windows 系统上,返回值包含来自子进程的有符号整数返回代码。在 Unix 上,waitstatus_to_exitcode() 可用于将
close
方法结果(退出状态)转换为不是None
的退出代码。 在 Windows 上,close
方法结果直接是退出代码(或None
)。这是使用 subprocess.Popen 实现的; 有关管理和与子进程通信的更强大方法,请参阅该类的文档。
- os.posix_spawn(path, argv, env, *, file_actions=None, setpgroup=None, resetids=False, setsid=False, setsigmask=(), setsigdef=(), scheduler=None)
包装
posix_spawn()
C 库 API 以供 Python 使用。大多数用户应该使用 subprocess.run() 而不是 posix_spawn()。
仅位置参数 path、args 和 env 类似于 execve()。
path 参数是可执行文件的路径。 path 应该包含一个目录。 使用 posix_spawnp() 传递一个没有目录的可执行文件。
file_actions 参数可能是一个元组序列,描述在 C 库实现的
fork()
和exec()
步骤之间对子进程中的特定文件描述符采取的操作。 每个元组中的第一项必须是下面列出的描述其余元组元素的三种类型指示符之一:- os.POSIX_SPAWN_OPEN
(
os.POSIX_SPAWN_OPEN
, fd, path, flags, mode)执行
os.dup2(os.open(path, flags, mode), fd)
。
- os.POSIX_SPAWN_CLOSE
(
os.POSIX_SPAWN_CLOSE
, fd)执行
os.close(fd)
。
- os.POSIX_SPAWN_DUP2
(
os.POSIX_SPAWN_DUP2
, fd, new_fd)执行
os.dup2(fd, new_fd)
。
这些元组对应于用于准备
posix_spawn()
调用本身的 C 库posix_spawn_file_actions_addopen()
、posix_spawn_file_actions_addclose()
和posix_spawn_file_actions_adddup2()
API 调用。setpgroup 参数会将子进程组设置为指定的值。 如果指定的值为 0,子进程组 ID 将与它的进程 ID 相同。 如果未设置 setpgroup 的值,子进程将继承父进程组 ID。 此参数对应于 C 库
POSIX_SPAWN_SETPGROUP
标志。如果 resetids 参数是
True
它将把子进程的有效 UID 和 GID 重置为父进程的真实 UID 和 GID。 如果参数是False
,则子节点保留父节点的有效 UID 和 GID。 在任何一种情况下,如果在可执行文件上启用了 set-user-ID 和 set-group-ID 权限位,它们的效果将覆盖有效 UID 和 GID 的设置。 此参数对应于 C 库POSIX_SPAWN_RESETIDS
标志。如果 setsid 参数是
True
,它将为 posix_spawn 创建一个新的会话 ID。 setsid 需要POSIX_SPAWN_SETSID
或POSIX_SPAWN_SETSID_NP
标志。 否则,会引发 NotImplementedError。setsigmask 参数将信号掩码设置为指定的信号集。 如果未使用该参数,则子级将继承父级的信号掩码。 此参数对应于 C 库
POSIX_SPAWN_SETSIGMASK
标志。sigdef 参数将重置指定集中所有信号的处置。 此参数对应于 C 库
POSIX_SPAWN_SETSIGDEF
标志。scheduler 参数必须是一个包含(可选)调度程序策略的元组和一个带有调度程序参数的 sched_param 实例。 代替调度程序策略的值
None
表示未提供。 此参数是 C 库POSIX_SPAWN_SETSCHEDPARAM
和POSIX_SPAWN_SETSCHEDULER
标志的组合。3.8 版中的新功能。
- os.posix_spawnp(path, argv, env, *, file_actions=None, setpgroup=None, resetids=False, setsid=False, setsigmask=(), setsigdef=(), scheduler=None)
包装
posix_spawnp()
C 库 API 以供 Python 使用。与 posix_spawn() 类似,除了系统在
PATH
环境变量指定的目录列表中搜索 executable 文件(在与execvp(3)
相同)。3.8 版中的新功能。
- os.register_at_fork(*, before=None, after_in_parent=None, after_in_child=None)
当使用 os.fork() 或类似的进程克隆 API 分叉新的子进程时,注册要执行的可调用对象。 参数是可选的且仅限关键字。 每个指定一个不同的调用点。
before 是在 fork 子进程之前调用的函数。
after_in_parent是fork一个子进程后从父进程调用的函数。
after_in_child 是从子进程调用的函数。
仅当控制权返回给 Python 解释器时才会进行这些调用。 典型的 子进程 启动不会触发它们,因为孩子不会重新进入解释器。
在分叉之前注册执行的函数以相反的注册顺序调用。 分叉后注册执行的函数(在父级或子级中)按注册顺序调用。
请注意,第三方 C 代码进行的
fork()
调用可能不会调用这些函数,除非它显式调用 PyOS_BeforeFork()、PyOS_AfterFork_Parent() 和 PyOS_AfterFork ()。无法取消注册函数。
3.7 版中的新功能。
- os.spawnl(mode, path, ...)
os.spawnle(mode, path, ..., env)
os.spawnlp(mode, file, ...)
os.spawnlpe(mode, file, ..., env)
os.spawnv(mode, path, args)
os.spawnve(mode, path, args, env)
os.spawnvp(mode, file, args)
os.spawnvpe(mode, file, args, env) 在新进程中执行程序path。
(请注意,subprocess 模块为生成新进程和检索其结果提供了更强大的工具;使用该模块比使用这些函数更可取。 特别检查 用子进程模块 替换旧函数部分。)
如果mode为P_NOWAIT,该函数返回新进程的进程id; 如果mode为P_WAIT,正常退出则返回进程的退出码,或
-signal
,其中信号是杀死进程的信号. 在 Windows 上,进程 ID 实际上是进程句柄,因此可以与 waitpid() 函数一起使用。注意在 VxWorks 上,当新进程被杀死时,此函数不会返回
-signal
。 相反,它引发 OSError 异常。spawn* 函数的“l”和“v”变体在命令行参数的传递方式上有所不同。 如果在编写代码时参数数量是固定的,那么“l”变体可能是最容易使用的; 单个参数只是成为
spawnl*()
功能的附加参数。 当参数数量可变时,“v”变体很好,参数在列表或元组中作为 args 参数传递。 无论哪种情况,子进程的参数都必须以正在运行的命令的名称开头。包括接近末尾的第二个“p”的变体(spawnlp()、spawnlpe()、spawnvp() 和 spawnvpe() ) 将使用
PATH
环境变量来定位程序 文件 。 当环境被替换时(使用 spawn*e 变体之一,将在下一段讨论),新环境用作PATH
的源] 多变的。 其他变体 spawnl()、spawnle()、spawnv() 和 spawnve(),将不使用 [ X127X]PATH
变量来定位可执行文件; path 必须包含适当的绝对或相对路径。对于 spawnle()、spawnlpe()、spawnve() 和 spawnvpe()(注意这些都以“e”结尾”),env 参数必须是一个映射,用于定义新进程的环境变量(它们用于代替当前进程的环境); 函数 spawnl()、spawnlp()、spawnv() 和 spawnvp() 都会导致新进程继承当前进程的环境。 注意 env 字典中的键和值必须是字符串; 无效的键或值将导致函数失败,返回值为
127
。例如,以下对 spawnlp() 和 spawnvpe() 的调用是等效的:
import os os.spawnlp(os.P_WAIT, 'cp', 'cp', 'index.html', '/dev/null') L = ['cp', 'index.html', '/dev/null'] os.spawnvpe(os.P_WAIT, 'cp', L, os.environ)
3.6 版更改: 接受 类路径对象 。
- os.P_NOWAIT
os.P_NOWAITO
- spawn* 系列函数的 mode 参数的可能值。 如果给出了这些值中的任何一个,则
spawn*()
函数将在新进程创建后立即返回,进程 ID 作为返回值。
- os.P_WAIT
- spawn* 系列函数的 mode 参数的可能值。 如果指定为 mode,则
spawn*()
函数在新进程运行完成之前不会返回,并返回运行成功进程的退出代码,或者-signal
如果信号终止进程。
- os.P_DETACH
os.P_OVERLAY
- spawn* 系列函数的 mode 参数的可能值。 它们的便携性不如上面列出的那些。 P_DETACH 与 P_NOWAIT 类似,但新进程与调用进程的控制台分离。 如果使用P_OVERLAY,则替换当前进程; spawn* 函数不会返回。
- os.startfile(path[, operation])
启动文件及其关联的应用程序。
当未指定 operation 或
'open'
时,这就像在 Windows 资源管理器中双击文件,或将文件名作为参数提供给 start 命令来自交互式命令外壳:文件使用与其扩展名关联的任何应用程序(如果有)打开。当给出另一个 操作 时,它必须是一个“命令动词”,指定应该对文件做什么。 Microsoft 记录的常用动词是
'print'
和'edit'
(用于文件)以及'explore'
和'find'
(用于目录)。startfile() 在关联的应用程序启动后立即返回。 没有等待应用程序关闭的选项,也没有办法检索应用程序的退出状态。 path 参数是相对于当前目录的。 如果要使用绝对路径,请确保第一个字符不是斜杠 (
'/'
); 如果是,则底层的 Win32ShellExecute()
函数不起作用。 使用 os.path.normpath() 函数确保路径为 Win32 正确编码。为了减少解释器启动开销,Win32
ShellExecute()
函数在首次调用该函数之前不会解析。 如果无法解析该函数,则会引发 NotImplementedError。
- os.system(command)
在子shell中执行命令(一个字符串)。 这是通过调用标准 C 函数
system()
来实现的,并且具有相同的限制。 对 sys.stdin 等的更改 不会反映在执行命令的环境中。 如果 command 生成任何输出,它将被发送到解释器标准输出流。 C标准没有规定C函数返回值的含义,所以Python函数的返回值是系统相关的。在 Unix 上,返回值是以为 wait() 指定的格式编码的进程的退出状态。
在Windows上,返回值是系统shell在运行command后返回的值。 shell由Windows环境变量
COMSPEC
给出:通常是cmd.exe,返回命令运行的退出状态; 在使用非本地 shell 的系统上,请查阅您的 shell 文档。subprocess 模块为生成新进程和检索结果提供了更强大的工具; 使用该模块比使用此功能更可取。 请参阅 子进程 文档中的 用子进程模块 替换旧函数部分,了解一些有用的方法。
在 Unix 上, waitstatus_to_exitcode() 可用于将结果(退出状态)转换为退出代码。 在 Windows 上,结果直接是退出代码。
- os.times()
返回当前的全局进程时间。 返回值是一个具有五个属性的对象:
user
- 用户时间system - 系统时间
children_user
- 所有子进程的用户时间children_system
- 所有子进程的系统时间elapsed
- 自过去一个固定点以来经过的实时时间
为了向后兼容,这个对象也表现得像一个包含
user
、system、children_user
、children_system
和elapsed
的五元组以该顺序。请参阅 Unix 上的 Unix 手册页 times(2) 和 times(3) 手册页或 Windows 上的 GetProcessTimes MSDN。 在 Windows 上,只有
user
和 system 是已知的; 其他属性为零。3.3 版更改: 返回类型从元组更改为具有命名属性的类元组对象。
- os.wait()
等待子进程完成,并返回一个包含其pid和退出状态指示的元组:一个16位数字,其低字节是杀死进程的信号号,高字节是退出状态(如果信号数字为零); 如果生成了核心文件,则设置低字节的高位。
waitstatus_to_exitcode() 可用于将退出状态转换为退出代码。
也可以看看
waitpid() 可用于等待特定子进程完成并具有更多选项。
- os.waitid(idtype, id, options)
等待一个或多个子进程完成。 idtype 在 Linux 上可以是 P_PID、P_PGID、P_ALL 或 P_PIDFD。 id 指定要等待的 pid。 options 由 WEXITED、WSTOPPED 或 WCONTINUED 中的一个或多个的 ORing 构造而成,另外还可以与 WNOHANG 进行 ORed 或 WNOWAIT。 返回值是一个对象,表示包含在
siginfo_t
结构中的数据,即:si_pid
、si_uid
、si_signo
、si_status
、si_code
或None
如果指定了 WNOHANG 并且没有处于可等待状态的孩子。3.3 版中的新功能。
- os.P_PID
os.P_PGID
os.P_ALL 这些是 waitid() 中 idtype 的可能值。 它们影响 id 的解释方式。
3.3 版中的新功能。
- os.P_PIDFD
这是一个 Linux 特定的 idtype,它表明 id 是一个引用进程的文件描述符。
3.9 版中的新功能。
- os.WEXITED
os.WSTOPPED
os.WNOWAIT 可以在 waitid() 中的 options 中使用的标志,用于指定要等待的子信号。
3.3 版中的新功能。
- os.CLD_EXITED
os.CLD_KILLED
os.CLD_DUMPED
os.CLD_TRAPPED
os.CLD_STOPPED
os.CLD_CONTINUED 这些是 waitid() 返回的结果中
si_code
的可能值。3.3 版中的新功能。
3.9 版更改: 添加 CLD_KILLED 和 CLD_STOPPED 值。
- os.waitpid(pid, options)
此函数的细节在 Unix 和 Windows 上有所不同。
在 Unix 上:等待进程 ID pid 给出的子进程完成,并返回一个包含其进程 ID 和退出状态指示的元组(编码为 wait())。 调用的语义受整数 options 的值影响,对于正常操作应该是
0
。如果 pid 大于
0
,则 waitpid() 请求该特定进程的状态信息。 如果 pid 是0
,则请求的是当前进程的进程组中任何子进程的状态。 如果 pid 是-1
,则请求属于当前进程的任何子进程。 如果 pid 小于-1
,则请求进程组-pid
中的任何进程的状态(pid 的绝对值)。当系统调用返回 -1 时,会以 errno 的值引发 OSError。
在 Windows 上:等待进程句柄 pid 给出的进程完成,并返回一个包含 pid 的元组,其退出状态左移 8 位(移位使跨平台使用的功能更容易)。 pid 小于或等于
0
在 Windows 上没有特殊含义,并引发异常。 整数 options 的值没有影响。 pid 可以指任何 id 已知的进程,不一定是子进程。 用 P_NOWAIT 调用的 spawn* 函数返回合适的进程句柄。waitstatus_to_exitcode() 可用于将退出状态转换为退出代码。
3.5 版更改: 如果系统调用被中断并且信号处理程序没有引发异常,该函数现在会重试系统调用而不是引发 InterruptedError 异常(参见 ]PEP 475 的基本原理)。
- os.wait3(options)
类似于 waitpid(),除了没有给出进程 id 参数并且返回一个包含子进程 id、退出状态指示和资源使用信息的 3 元素元组。 有关资源使用信息的详细信息,请参阅 resource.getrusage()。 选项参数与提供给 waitpid() 和 wait4() 的参数相同。
waitstatus_to_exitcode() 可用于将退出状态转换为退出代码。
- os.wait4(pid, options)
类似于 waitpid(),除了一个 3 元素元组,包含子进程 ID、退出状态指示和资源使用信息被返回。 有关资源使用信息的详细信息,请参阅 resource.getrusage()。 wait4() 的参数与提供给 waitpid() 的参数相同。
waitstatus_to_exitcode() 可用于将退出状态转换为退出代码。
- os.waitstatus_to_exitcode(status)
将等待状态转换为退出代码。
在 Unix 上:
如果进程正常退出(如果
WIFEXITED(status)
为真),则返回进程退出状态(返回WEXITSTATUS(status)
):结果大于等于0。如果进程被信号终止(如果
WIFSIGNALED(status)
为真),则返回-signum
其中 signum 是导致进程终止的信号编号(返回 [ X178X]):结果小于 0。否则,引发 ValueError。
在 Windows 上,返回 status 右移 8 位。
在 Unix 上,如果正在跟踪进程或者如果使用 WUNTRACED 选项调用了 waitpid(),则调用者必须首先检查
WIFSTOPPED(status)
是否为真。 如果WIFSTOPPED(status)
为真,则不得调用此函数。3.9 版中的新功能。
- os.WNOHANG
- waitpid() 选项在没有子进程状态立即可用时立即返回。 在这种情况下,函数返回
(0, 0)
。
- os.WCONTINUED
- 如果自上次报告状态后子进程从作业控制停止继续,则此选项会导致报告子进程。
- os.WUNTRACED
- 如果子进程已停止但自停止后尚未报告其当前状态,则此选项会导致报告子进程。
以下函数将 system()、wait() 或 waitpid() 返回的进程状态代码作为参数。 它们可用于确定进程的处置。
- os.WCOREDUMP(status)
如果为进程生成了核心转储,则返回
True
,否则返回False
。仅当 WIFSIGNALED() 为真时才应使用此函数。
- os.WIFCONTINUED(status)
如果停止的子进程已通过 SIGCONT 的传递恢复(如果进程已从作业控制停止继续),则返回
True
,否则返回False
。参见 WCONTINUED 选项。
- os.WIFSTOPPED(status)
如果进程因传递信号而停止,则返回
True
,否则返回False
。WIFSTOPPED() 仅在 waitpid() 调用是使用 WUNTRACED 选项完成或正在跟踪进程时才返回
True
(参见 [ X158X]ptrace(2))。
- os.WIFSIGNALED(status)
- 如果进程被信号终止,则返回
True
,否则返回False
。
- os.WIFEXITED(status)
- 如果进程正常退出,即通过调用
exit()
或_exit()
,或者从main()
返回,则返回True
; 否则返回False
。
- os.WEXITSTATUS(status)
返回进程退出状态。
仅当 WIFEXITED() 为真时才应使用此函数。
- os.WSTOPSIG(status)
返回导致进程停止的信号。
仅当 WIFSTOPPED() 为真时才应使用此函数。
- os.WTERMSIG(status)
返回导致进程终止的信号编号。
仅当 WIFSIGNALED() 为真时才应使用此函数。
调度器接口
这些函数控制操作系统如何为进程分配 CPU 时间。 它们仅在某些 Unix 平台上可用。 有关更多详细信息,请查阅您的 Unix 联机帮助页。
3.3 版中的新功能。
如果操作系统支持,则会公开以下调度策略。
- os.SCHED_OTHER
- 默认调度策略。
- os.SCHED_BATCH
- CPU 密集型进程的调度策略,试图保持计算机其余部分的交互性。
- os.SCHED_IDLE
- 极低优先级后台任务的调度策略。
- os.SCHED_SPORADIC
- 零星服务器程序的调度策略。
- os.SCHED_FIFO
- 先进先出调度策略。
- os.SCHED_RR
- 循环调度策略。
- os.SCHED_RESET_ON_FORK
- 该标志可以与任何其他调度策略进行或运算。 当设置了此标志的进程分叉时,其子进程的调度策略和优先级将重置为默认值。
- class os.sched_param(sched_priority)
此类表示 sched_setparam()、sched_setscheduler() 和 sched_getparam() 中使用的可调调度参数。 它是不可变的。
目前,只有一个可能的参数:
- sched_priority
调度策略的调度优先级。
- os.sched_get_priority_min(policy)
- 获取 policy 的最小优先级值。 policy 是上述调度策略常量之一。
- os.sched_get_priority_max(policy)
- 获取 policy 的最大优先级值。 policy 是上述调度策略常量之一。
- os.sched_setscheduler(pid, policy, param)
- 使用PID pid为进程设置调度策略。 pid 为 0 表示调用进程。 policy 是上述调度策略常量之一。 param 是一个 sched_param 实例。
- os.sched_getscheduler(pid)
- 返回 PID pid 进程的调度策略。 pid 为 0 表示调用进程。 结果是上面的调度策略常量之一。
- os.sched_setparam(pid, param)
- 使用PID pid为进程设置调度参数。 pid 为 0 表示调用进程。 param 是一个 sched_param 实例。
- os.sched_getparam(pid)
- 将调度参数作为具有 PID pid 的进程的 sched_param 实例返回。 pid 为 0 表示调用进程。
- os.sched_rr_get_interval(pid)
- 返回具有 PID pid 的进程的循环量(以秒为单位)。 pid 为 0 表示调用进程。
- os.sched_yield()
- 自愿放弃 CPU。
- os.sched_setaffinity(pid, mask)
- 将具有 PID pid 的进程(或当前进程,如果为零)限制为一组 CPU。 mask 是一个可迭代的整数,表示进程应该被限制到的 CPU 集。
- os.sched_getaffinity(pid)
- 返回具有 PID pid 的进程(或当前进程,如果为零)被限制到的 CPU 集。
其他系统信息
- os.confstr(name)
返回字符串值系统配置值。 name 指定要检索的配置值; 它可能是一个字符串,它是定义的系统值的名称; 这些名称在许多标准(POSIX、Unix 95、Unix 98 等)中都有规定。 一些平台还定义了其他名称。 主机操作系统已知的名称作为
confstr_names
字典的键给出。 对于未包含在该映射中的配置变量,也接受为 name 传递整数。如果未定义 name 指定的配置值,则返回
None
。如果 name 是一个字符串并且未知,则会引发 ValueError。 如果主机系统不支持 name 的特定值,即使它包含在
confstr_names
中,也会引发 OSError 和 errno.EINVAL 为错误编号。
- os.confstr_names
- confstr() 接受的字典映射名称到主机操作系统为这些名称定义的整数值。 这可用于确定系统已知的名称集。
- os.cpu_count()
返回系统中的 CPU 数量。 如果未确定,则返回
None
。这个数字不等于当前进程可以使用的 CPU 数量。 可用 CPU 的数量可以通过
len(os.sched_getaffinity(0))
获得3.4 版中的新功能。
- os.getloadavg()
- 返回系统运行队列中过去 1、5 和 15 分钟的平均进程数,如果无法获得平均负载,则引发 OSError。
- os.sysconf(name)
- 返回整数值系统配置值。 如果未定义 name 指定的配置值,则返回
-1
。 关于 confstr() 的 name 参数的评论也适用于此; 提供已知名称信息的字典由sysconf_names
给出。
- os.sysconf_names
- sysconf() 接受的字典映射名称到主机操作系统为这些名称定义的整数值。 这可用于确定系统已知的名称集。
以下数据值用于支持路径操作操作。 这些是为所有平台定义的。
os.path 模块中定义了对路径名的高级操作。
- os.curdir
- 操作系统用来引用当前目录的常量字符串。 这是用于 Windows 和 POSIX 的
'.'
。 也可以通过 os.path 获得。
- os.pardir
- 操作系统用来引用父目录的常量字符串。 这是用于 Windows 和 POSIX 的
'..'
。 也可以通过 os.path 获得。
- os.sep
- 操作系统用来分隔路径名组件的字符。 这是 POSIX 的
'/'
和 Windows 的'\\'
。 请注意,知道这不足以解析或连接路径名——使用 os.path.split() 和 os.path.join()——但它偶尔有用. 也可以通过 os.path 获得。
- os.altsep
- 操作系统用于分隔路径名组件的替代字符,如果仅存在一个分隔符,则为
None
。 在sep
是反斜杠的 Windows 系统上,这被设置为'/'
。 也可以通过 os.path 获得。
- os.extsep
- 将基本文件名与扩展名分开的字符; 例如,
os.py
中的'.'
。 也可以通过 os.path 获得。
- os.pathsep
- 操作系统通常用于分隔搜索路径组件的字符(如
PATH
),例如':'
用于 POSIX 或';'
用于 Windows。 也可以通过 os.path 获得。
- os.linesep
- 用于在当前平台上分隔(或更确切地说,终止)行的字符串。 这可以是单个字符,例如 POSIX 的
'\n'
,或多个字符,例如 Windows 的'\r\n'
。 写入以文本模式打开的文件时,不要使用 os.linesep 作为行终止符(默认); 在所有平台上改用单个'\n'
。
- os.devnull
- 空设备的文件路径。 例如:
'/dev/null'
用于 POSIX,'nul'
用于 Windows。 也可以通过 os.path 获得。
- os.RTLD_LAZY
os.RTLD_NOW
os.RTLD_GLOBAL
os.RTLD_LOCAL
os.RTLD_NODELETE
os.RTLD_NOLOAD
os.RTLD_DEEPBIND 与 setdlopenflags() 和 getdlopenflags() 函数一起使用的标志。 有关不同标志的含义,请参阅 Unix 手册页 dlopen(3)。
3.3 版中的新功能。
随机数
- os.getrandom(size, flags=0)
最多获得 size 个随机字节。 该函数返回的字节数可以少于请求的字节数。
这些字节可用于为用户空间随机数生成器提供种子或用于加密目的。
getrandom()
依赖于从设备驱动程序和其他环境噪声源收集的熵。 不必要地读取大量数据将对/dev/random
和/dev/urandom
设备的其他用户产生负面影响。flags 参数是一个位掩码,可以包含零个或多个以下值 ORed 在一起:os.GRND_RANDOM 和 GRND_NONBLOCK。
另请参阅 Linux getrandom() 手册页 。
3.6 版中的新功能。
- os.urandom(size)
返回适合加密使用的 size 随机字节字符串。
此函数从特定于操作系统的随机源返回随机字节。 返回的数据对于加密应用程序来说应该是不可预测的,尽管它的确切质量取决于操作系统的实现。
在 Linux 上,如果
getrandom()
系统调用可用,则在阻塞模式下使用:阻塞直到系统 urandom 熵池初始化(内核收集 128 位熵)。 有关基本原理,请参阅 PEP 524。 在 Linux 上,getrandom() 函数可用于在非阻塞模式下获取随机字节(使用 GRND_NONBLOCK 标志)或轮询直到系统 urandom 熵池初始化。在类 Unix 系统上,从
/dev/urandom
设备读取随机字节。 如果/dev/urandom
设备不可用或不可读,则会引发 NotImplementedError 异常。在 Windows 上,它将使用
CryptGenRandom()
。也可以看看
secrets 模块提供更高级别的功能。 有关您平台提供的随机数生成器的易于使用的界面,请参阅 random.SystemRandom。
3.6.0 版本更改: 在 Linux 上,
getrandom()
现在用于阻塞模式以增加安全性。在 3.5.2 版更改: 在 Linux 上,如果
getrandom()
系统调用阻塞(urandom 熵池尚未初始化),则回退读取/dev/urandom
。3.5 版更改: 在 Linux 3.17 和更新版本上,现在使用
getrandom()
系统调用(可用时)。 在 OpenBSD 5.6 和更新版本上,现在使用 Cgetentropy()
函数。 这些函数避免使用内部文件描述符。
- os.GRND_NONBLOCK
默认情况下,从
/dev/random
读取时,如果没有随机字节可用,getrandom() 会阻塞,而从/dev/urandom
读取时,如果熵池还没有,它会阻塞被初始化。如果设置了 GRND_NONBLOCK 标志,则 getrandom() 在这些情况下不会阻塞,而是立即引发 BlockingIOError。
3.6 版中的新功能。
- os.GRND_RANDOM
如果设置了该位,则从
/dev/random
池而不是/dev/urandom
池中抽取随机字节。3.6 版中的新功能。