os
--- 多種操作系統接口?
源代碼: Lib/os.py
本模塊提供了一種使用與操作系統相關(guān)的功能的便捷式途徑。 如果你只是想讀寫(xiě)一個(gè)文件,請參閱 open()
,如果你想操作文件路徑,請參閱 os.path
模塊,如果你想讀取通過(guò)命令行給出的所有文件中的所有行,請參閱 fileinput
模塊。 為了創(chuàng )建臨時(shí)文件和目錄,請參閱 tempfile
模塊,對于高級文件和目錄處理,請參閱 shutil
模塊。
關(guān)于這些函數的適用性的說(shuō)明:
Python中所有依賴(lài)于操作系統的內置模塊的設計都是這樣,只要不同的操作系統某一相同的功能可用,它就使用相同的接口。例如,函數
os.stat(path)
以相同的格式返回關(guān)于 path 的狀態(tài)信息(該格式源于 POSIX 接口)。特定于某一操作系統的擴展通過(guò)操作
os
模塊也是可用的,但是使用它們當然是對可移植性的一種威脅。所有接受路徑或文件名的函數都同時(shí)支持字節串和字符串對象,并在返回路徑或文件名時(shí)使用相應類(lèi)型的對象作為結果。
在 VxWorks 系統上,os.popen, os.fork, os.execv 和 os.spawn*p* 都未支持。
備注
如果使用無(wú)效或無(wú)法訪(fǎng)問(wèn)的文件名與路徑,或者其他類(lèi)型正確但操作系統不接受的參數,此模塊的所有函數都拋出 OSError
(或者它的子類(lèi))。
- os.name?
導入的依賴(lài)特定操作系統的模塊的名稱(chēng)。以下名稱(chēng)目前已注冊:
'posix'
,'nt'
,'java'
.
文件名,命令行參數,以及環(huán)境變量。?
在 Python 中,使用字符串類(lèi)型表示文件名、命令行參數和環(huán)境變量。 在某些系統上,在將這些字符串傳遞給操作系統之前,必須將這些字符串解碼為字節。 Python 使用 filesystem encoding and error handler 來(lái)執行此轉換(請參閱 sys.getfilesystemencoding()
)。
filesystem encoding and error handler 是在 Python 啟動(dòng)時(shí)通過(guò) PyConfig_Read()
函數來(lái)配置的:請參閱 PyConfig
的 filesystem_encoding
和 filesystem_errors
等成員。
在 3.1 版更改: 在某些系統上,使用文件系統編碼進(jìn)行轉換可能會(huì )失敗。 在這種情況下,Python 會(huì )使用 代理轉義編碼錯誤處理器,這意味著(zhù)在解碼時(shí),不可解碼的字節被 Unicode 字符 U+DCxx 替換,并且這些字節在編碼時(shí)再次轉換為原始字節。
文件系統編碼器 必須保證能成功解碼所有 128 以?xún)鹊淖止?。如果不能保證,API 函數可能觸發(fā) UnicodeError
。
另請參見(jiàn) locale encoding。
Python UTF-8 模式?
3.7 新版功能: 有關(guān)更多詳細信息,請參閱 PEP 540 。
Python UTF-8 模式會(huì )忽略 locale encoding 并強制使用 UTF-8 編碼。
用 UTF-8 作為 文件系統編碼。
sys.getfilesystemencoding()
returns'utf-8'
.locale.getpreferredencoding()
returns'utf-8'
(the do_setlocale argument has no effect).sys.stdin
,sys.stdout
和sys.stderr
都將 UTF-8 用作它們的文本編碼,并且為sys.stdin
和sys.stdout
啟用surrogateescape
錯誤處理句柄 (sys.stderr
會(huì )繼續使用backslashreplace
如同在默認的局部感知模式下一樣)On Unix,
os.device_encoding()
returns'utf-8'
rather than the device encoding.
請注意 UTF-8 模式下的標準流設置可以被 PYTHONIOENCODING
所覆蓋(在默認的區域感知模式下也同樣如此)。
作為低層級 API 發(fā)生改變的結果,其他高層級 API 也會(huì )表現出不同的默認行為:
命令行參數,環(huán)境變量和文件名會(huì )使用 UTF-8 編碼來(lái)解碼為文本。
os.fsdecode()
和os.fsencode()
會(huì )使用 UTF-8 編碼。open()
,io.open()
和codecs.open()
默認會(huì )使用 UTF-8 編碼。 但是,它們默認仍將使用嚴格錯誤處理句柄,因此試圖在文本模式下打開(kāi)二進(jìn)制文件將可能引發(fā)異常,而不是生成無(wú)意義的數據。
如果在 Python 啟動(dòng)時(shí) LC_CTYPE 區域設為 C
或 POSIX
,則啟用 Python UTF-8 模式 (參見(jiàn) PyConfig_Read()
函數)。
它可以通過(guò)命令行選項 -X utf8
和環(huán)境變量 PYTHONUTF8
,來(lái)啟用或禁用。
如果沒(méi)有設置 PYTHONUTF8
環(huán)境變量,那么解釋器默認使用當前的地區設置,除非 當前地區識別為基于 ASCII 的傳統地區(如 PYTHONCOERCECLOCALE
所述),并且 locale coercion 被禁用或失敗。在這種傳統地區,除非顯式指明不要如此,解釋器將默認啟用 UTF-8 模式。
Python UTF-8 模式只能在 Python 啟動(dòng)時(shí)啟用。其值可以從 sys.flags.utf8_mode
讀取。
另請參閱 在 Windows 中的 UTF-8 模式 和 filesystem encoding and error handler。
進(jìn)程參數?
這些函數和數據項提供了操作當前進(jìn)程和用戶(hù)的信息。
- os.environ?
A mapping object where keys and values are strings that represent the process environment. For example,
environ['HOME']
is the pathname of your home directory (on some platforms), and is equivalent togetenv("HOME")
in C.This mapping is captured the first time the
os
module is imported, typically during Python startup as part of processingsite.py
. Changes to the environment made after this time are not reflected inos.environ
, except for changes made by modifyingos.environ
directly.該映射除了可以用于查詢(xún)環(huán)境外,還能用于修改環(huán)境。當該映射被修改時(shí),將自動(dòng)調用
putenv()
。在Unix系統上,鍵和值會(huì )使用
sys.getfilesystemencoding()
和'surrogateescape'
的錯誤處理。如果你想使用其他的編碼,使用environb
。備注
Calling
putenv()
directly does not changeos.environ
, so it's better to modifyos.environ
.備注
在某些平臺上,包括 FreeBSD 和 macOS,設置
environ
可能導致內存泄漏。 請參閱putenv()
的系統文檔。You can delete items in this mapping to unset environment variables.
unsetenv()
will be called automatically when an item is deleted fromos.environ
, and when one of thepop()
orclear()
methods is called.在 3.9 版更改: 已更新并支持了 PEP 584 的合并 (
|
) 和更新 (|=
) 運算符。
- os.environb?
Bytes version of
environ
: a mapping object where both keys and values arebytes
objects representing the process environment.environ
andenvironb
are synchronized (modifyingenvironb
updatesenviron
, and vice versa).只有在
supports_bytes_environ
為True
的時(shí)候environb
才是可用的。3.2 新版功能.
在 3.9 版更改: 已更新并支持了 PEP 584 的合并 (
|
) 和更新 (|=
) 運算符。
- os.chdir(path)
- os.fchdir(fd)
- os.getcwd()
以上函數請參閱 文件和目錄 。
- os.fsencode(filename)?
將 類(lèi)似路徑形式的 filename 編碼為 filesystem encoding and error handler;原樣返回
bytes
。fsdecode()
是此函數的逆向函數。3.2 新版功能.
在 3.6 版更改: 增加對實(shí)現了
os.PathLike
接口的對象的支持。
- os.fsdecode(filename)?
根據 filesystem encoding and error handler 來(lái)解碼 類(lèi)似路徑形式的 filename;原樣返回
str
。fsencode()
是此函數的逆向函數。3.2 新版功能.
在 3.6 版更改: 增加對實(shí)現了
os.PathLike
接口的對象的支持。
- os.fspath(path)?
返回路徑的文件系統表示。
如果傳入的是
str
或bytes
類(lèi)型的字符串,將原樣返回。否則__fspath__()
將被調用,如果得到的是一個(gè)str
或bytes
類(lèi)型的對象,那就返回這個(gè)值。其他所有情況則會(huì )拋出TypeError
異常。3.6 新版功能.
- class os.PathLike?
某些對象用于表示文件系統中的路徑(如
pathlib.PurePath
對象),本類(lèi)是這些對象的 抽象基類(lèi)。3.6 新版功能.
- os.getenv(key, default=None)?
Return the value of the environment variable key if it exists, or default if it doesn't. key, default and the result are str. Note that since
getenv()
usesos.environ
, the mapping ofgetenv()
is similarly also captured on import, and the function may not reflect future environment changes.在Unix系統上,鍵和值會(huì )使用
sys.getfilesystemencoding()
和``'surrogateescape'`` 錯誤處理進(jìn)行解碼。如果你想使用其他的編碼,使用os.getenvb()
。可用性: 大部分的Unix系統,Windows。
- os.getenvb(key, default=None)?
Return the value of the environment variable key if it exists, or default if it doesn't. key, default and the result are bytes. Note that since
getenvb()
usesos.environb
, the mapping ofgetenvb()
is similarly also captured on import, and the function may not reflect future environment changes.getenvb()
僅在supports_bytes_environ
為True
時(shí)可用。可用性: 大部分的Unix系統。
3.2 新版功能.
- os.get_exec_path(env=None)?
返回將用于搜索可執行文件的目錄列表,與在外殼程序中啟動(dòng)一個(gè)進(jìn)程時(shí)相似。指定的 env 應為用于搜索 PATH 的環(huán)境變量字典。默認情況下,當 env 為
None
時(shí),將會(huì )使用environ
。3.2 新版功能.
- os.getgrouplist(user, group)?
Return list of group ids that user belongs to. If group is not in the list, it is included; typically, group is specified as the group ID field from the password record for user, because that group ID will otherwise be potentially omitted.
可用性: Unix。
3.3 新版功能.
- os.getgroups()?
返回當前進(jìn)程關(guān)聯(lián)的附加組ID列表
可用性: Unix。
備注
在 macOS 中,
getgroups()
會(huì )和其他 Unix 平臺有所不同。 如果 Python 解釋器是在10.5
或更早版本中部署的,則getgroups()
會(huì )返回與當前用戶(hù)進(jìn)程相關(guān)聯(lián)的有效組 ID 列表;該列表受限于系統預定義的條目數量,通常為 16,并且在適當的權限下還可通過(guò)調用setgroups()
來(lái)修改。 如果是在高于10.5
的版本中部署的,則getgroups()
會(huì )返回與進(jìn)程的有效用戶(hù) ID 相關(guān)聯(lián)的當前組訪(fǎng)問(wèn)列表;組訪(fǎng)問(wèn)列表可能會(huì )在進(jìn)程的生命周期之內發(fā)生改變,它不會(huì )受對setgroups()
的調用影響,且其長(cháng)度也不被限制為 16。 部署目標值MACOSX_DEPLOYMENT_TARGET
可以通過(guò)sysconfig.get_config_var()
來(lái)獲取。
- os.getlogin()?
返回通過(guò)控制終端進(jìn)程進(jìn)行登錄的用戶(hù)名。在多數情況下,使用
getpass.getuser()
會(huì )更有效,因為后者會(huì )通過(guò)檢查環(huán)境變量LOGNAME
或USERNAME
來(lái)查找用戶(hù),再由pwd.getpwuid(os.getuid())[0]
來(lái)獲取當前用戶(hù) ID 的登錄名。可用性: Unix, Windows。
- os.getpgid(pid)?
根據進(jìn)程id pid 返回進(jìn)程的組 ID 列表。如果 pid 為 0,則返回當前進(jìn)程的進(jìn)程組 ID 列表
可用性: Unix。
- os.getpid()?
返回當前進(jìn)程ID
- os.getppid()?
返回父進(jìn)程ID。當父進(jìn)程已經(jīng)結束,在Unix中返回的ID是初始進(jìn)程(1)中的一個(gè),在Windows中仍然是同一個(gè)進(jìn)程ID,該進(jìn)程ID有可能已經(jīng)被進(jìn)行進(jìn)程所占用。
可用性: Unix, Windows。
在 3.2 版更改: 添加WIndows的支持。
- os.getpriority(which, who)?
獲取程序調度優(yōu)先級。which 參數值可以是
PRIO_PROCESS
,PRIO_PGRP
,或PRIO_USER
中的一個(gè),who 是相對于 which (PRIO_PROCESS
的進(jìn)程標識符,PRIO_PGRP
的進(jìn)程組標識符和PRIO_USER
的用戶(hù)ID)。當 who 為 0 時(shí)(分別)表示調用的進(jìn)程,調用進(jìn)程的進(jìn)程組或調用進(jìn)程所屬的真實(shí)用戶(hù) ID。可用性: Unix。
3.3 新版功能.
- os.PRIO_PROCESS?
- os.PRIO_PGRP?
- os.PRIO_USER?
函數
getpriority()
和setpriority()
的參數。可用性: Unix。
3.3 新版功能.
- os.getresuid()?
返回一個(gè)由 (ruid, euid, suid) 所組成的元組,分別表示當前進(jìn)程的真實(shí)用戶(hù)ID,有效用戶(hù)ID和暫存用戶(hù)ID。
可用性: Unix。
3.2 新版功能.
- os.getresgid()?
返回一個(gè)由 (rgid, egid, sgid) 所組成的元組,分別表示當前進(jìn)程的真實(shí)組ID,有效組ID和暫存組ID。
可用性: Unix。
3.2 新版功能.
- os.initgroups(username, gid)?
調用系統 initgroups(),使用指定用戶(hù)所在的所有值來(lái)初始化組訪(fǎng)問(wèn)列表,包括指定的組ID。
可用性: Unix。
3.2 新版功能.
- os.putenv(key, value)?
將名為 key 的環(huán)境變量值設置為 value。該變量名修改會(huì )影響由
os.system()
,popen()
,fork()
和execv()
發(fā)起的子進(jìn)程。Assignments to items in
os.environ
are automatically translated into corresponding calls toputenv()
; however, calls toputenv()
don't updateos.environ
, so it is actually preferable to assign to items ofos.environ
. This also applies togetenv()
andgetenvb()
, which respectively useos.environ
andos.environb
in their implementations.備注
在某些平臺上,包括 FreeBSD 和 macOS,設置
environ
可能導致內存泄漏。 請參閱putenv()
的系統文檔。引發(fā)一個(gè) 審計事件
os.putenv
,附帶參數key
,value
。在 3.9 版更改: 該函數現在總是可用。
- os.setgroups(groups)?
將 group 參數值設置為與當進(jìn)程相關(guān)聯(lián)的附加組ID列表。group 參數必須為一個(gè)序列,每個(gè)元素應為每個(gè)組的數字ID。該操作通常只適用于超級用戶(hù)。
可用性: Unix。
備注
在 macOS 中,groups 的長(cháng)度不能超過(guò)系統定義的最大有效組 ID 數量,通常為 16。 對于未返回與調用 setgroups() 產(chǎn)生的相同組列表的情況,請參閱
getgroups()
的文檔。
- os.setpgrp()?
根據已實(shí)現的版本(如果有)來(lái)調用系統
setpgrp()
或setpgrp(0, 0)
。相關(guān)說(shuō)明,請參考 Unix 手冊。可用性: Unix。
- os.setpgid(pid, pgrp)?
使用系統調用
setpgid()
,將 pid 對應進(jìn)程的組ID設置為 pgrp。相關(guān)說(shuō)明,請參考 Unix 手冊。可用性: Unix。
- os.setpriority(which, who, priority)?
設置程序調度優(yōu)先級。 which 的值為
PRIO_PROCESS
,PRIO_PGRP
或PRIO_USER
之一,而 who 會(huì )相對于 which (PRIO_PROCESS
的進(jìn)程標識符,PRIO_PGRP
的進(jìn)程組標識符和PRIO_USER
的用戶(hù) ID) 被解析。 who 值為零 (分別) 表示調用進(jìn)程,調用進(jìn)程的進(jìn)程組或調用進(jìn)程的真實(shí)用戶(hù) ID。 priority 是范圍在 -20 至 19 的值。 默認優(yōu)先級為 0;較小的優(yōu)先級數值會(huì )更優(yōu)先被調度。可用性: Unix。
3.3 新版功能.
- os.strerror(code)?
根據 code 中的錯誤碼返回錯誤消息。 在某些平臺上當給出未知錯誤碼時(shí)
strerror()
將返回NULL
并會(huì )引發(fā)ValueError
。
- os.supports_bytes_environ?
如果操作系統上原生環(huán)境類(lèi)型是字節型則為
True
(例如在 Windows 上為False
)。3.2 新版功能.
- os.umask(mask)?
設定當前數值掩碼并返回之前的掩碼。
- os.uname()?
返回當前操作系統的識別信息。返回值是一個(gè)有5個(gè)屬性的對象:
sysname
- 操作系統名nodename
- 機器在網(wǎng)絡(luò )上的名稱(chēng)(需要先設定)release
- 操作系統發(fā)行信息version
- 操作系統版本信息machine
- 硬件標識符
為了向后兼容,該對象也是可迭代的,像是一個(gè)按照
sysname
,nodename
,release
,version
,和machine
順序組成的元組。有些系統會(huì )將
nodename
截短為 8 個(gè)字符或截短至前綴部分;獲取主機名的一個(gè)更好方式是socket.gethostname()
或甚至可以用socket.gethostbyaddr(socket.gethostname())
。可用性: 較新的 Unix 版本。
在 3.3 版更改: 返回結果的類(lèi)型由元組變成一個(gè)類(lèi)似元組的對象,同時(shí)具有命名的屬性。
- os.unsetenv(key)?
取消設置(刪除)名為 key 的環(huán)境變量。變量名的改變會(huì )影響由
os.system()
,popen()
,fork()
和execv()
觸發(fā)的子進(jìn)程。Deletion of items in
os.environ
is automatically translated into a corresponding call tounsetenv()
; however, calls tounsetenv()
don't updateos.environ
, so it is actually preferable to delete items ofos.environ
.引發(fā)一個(gè) 審計事件
os.unsetenv
,附帶參數key
。在 3.9 版更改: 該函數現在總是可用,并且在 Windows 上也可用。
創(chuàng )建文件對象?
這些函數創(chuàng )建新的 file objects 。(參見(jiàn) open()
以獲取打開(kāi)文件描述符的相關(guān)信息。)
文件描述符操作?
這些函數對文件描述符所引用的 I/O 流進(jìn)行操作。
文件描述符是一些小的整數,對應于當前進(jìn)程所打開(kāi)的文件。例如,標準輸入的文件描述符通常是0,標準輸出是1,標準錯誤是2。之后被進(jìn)程打開(kāi)的文件的文件描述符會(huì )被依次指定為3,4,5等?!拔募枋龇边@個(gè)詞有點(diǎn)誤導性,在 Unix 平臺中套接字和管道也被文件描述符所引用。
當需要時(shí),可以用 fileno()
可以獲得 file object 所對應的文件描述符。需要注意的是,直接使用文件描述符會(huì )繞過(guò)文件對象的方法,會(huì )忽略如數據內部緩沖等情況。
- os.close(fd)?
關(guān)閉文件描述符 fd。
- os.closerange(fd_low, fd_high)?
關(guān)閉從 fd_low (包括)到 fd_high (排除)間的文件描述符,并忽略錯誤。類(lèi)似(但快于):
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 開(kāi)始讀取,到文件描述符 dst,從偏移量 offset_dst 開(kāi)始寫(xiě)入。如果 offset_src 為 None,則 src 將從當前位置開(kāi)始讀??;offset_dst 同理。src 和 dst 指向的文件必須處于相同的文件系統,否則將會(huì )拋出一個(gè)
errno
被設為errno.EXDEV
的OSError
。此復制的完成沒(méi)有額外的從內核到用戶(hù)空間再回到內核的數據轉移花費。另外,一些文件系統可能實(shí)現額外的優(yōu)化。完成復制就如同打開(kāi)兩個(gè)二進(jìn)制文件一樣。
返回值是復制的字節的數目。這可能低于需求的數目。
Availability: Linux kernel >= 4.5 或 glibc >= 2.27。
3.8 新版功能.
- os.device_encoding(fd)?
如果連接到終端,則返回一個(gè)與 fd 關(guān)聯(lián)的設備描述字符,否則返回
None
。在 Unix 上,如果啟用了 Python UTF-8 模式,則返回
'UTF-8'
而不是設備的編碼格式。在 3.10 版更改: 在 Unix 上,該函數現在實(shí)現了 Python UTF-8 模式。
- os.dup(fd)?
返回一個(gè)文件描述符 fd 的副本。該文件描述符的副本是 不可繼承的。
在 Windows 中,當復制一個(gè)標準流(0: stdin, 1: stdout, 2: stderr)時(shí),新的文件描述符是 可繼承的。
在 3.4 版更改: 新的文件描述符現在是不可繼承的。
- os.dup2(fd, fd2, inheritable=True)?
把文件描述符 fd 復制為 fd2,必要時(shí)先關(guān)閉后者。返回 fd2。新的文件描述符默認是 可繼承的,除非在 inheritable 為
False
時(shí),是不可繼承的。在 3.4 版更改: 添加可選參數 inheritable。
在 3.7 版更改: 成功時(shí)返回 fd2,以過(guò)去的版本中,總是返回
None
。
- os.fchmod(fd, mode)?
將 fd 指定文件的權限狀態(tài)修改為 mode??梢詤⒖?
chmod()
中列出 mode 的可用值。從Python 3.3開(kāi)始,這相當于os.chmod(fd, mode)
。引發(fā)一個(gè) 審計事件
os.chmod
,附帶參數path
、mode
、dir_fd
。可用性: Unix。
- os.fchown(fd, uid, gid)?
分別將 fd 指定文件的所有者和組 ID 修改為 uid 和 gid 的值。若不想變更其中的某個(gè) ID,可將相應值設為 -1。參考
chown()
。從 Python 3.3 開(kāi)始,這相當于os.chown(fd, uid, gid)
。引發(fā)一個(gè) 審計事件
os.chown
,附帶參數path
、uid
、gid
、dir_fd
。可用性: Unix。
- os.fpathconf(fd, name)?
返回與打開(kāi)的文件有關(guān)的系統配置信息。name 指定要查找的配置名稱(chēng),它可以是字符串,是一個(gè)系統已定義的名稱(chēng),這些名稱(chēng)定義在不同標準(POSIX.1,Unix 95,Unix 98 等)中。一些平臺還定義了額外的其他名稱(chēng)。當前操作系統已定義的名稱(chēng)在
pathconf_names
字典中給出。對于未包含在該映射中的配置名稱(chēng),也可以傳遞一個(gè)整數作為 name。如果 name 是一個(gè)字符串且不是已定義的名稱(chēng),將拋出
ValueError
異常。如果當前系統不支持 name 指定的配置名稱(chēng),即使該名稱(chēng)存在于pathconf_names
,也會(huì )拋出OSError
異常,錯誤碼為errno.EINVAL
。從 Python 3.3 起,此功能等價(jià)于
os.pathconf(fd, name)
。可用性: Unix。
- os.fstat(fd)?
獲取文件描述符 fd 的狀態(tài). 返回一個(gè)
stat_result
對象。從 Python 3.3 起,此功能等價(jià)于
os.stat(fd)
。參見(jiàn)
stat()
函數。
- os.fstatvfs(fd)?
返回文件系統的信息,該文件系統是文件描述符 fd 指向的文件所在的文件系統,與
statvfs()
一樣。從 Python 3.3 開(kāi)始,它等效于os.statvfs(fd)
。可用性: Unix。
- os.fsync(fd)?
強制將文件描述符 fd 指向的文件寫(xiě)入磁盤(pán)。在 Unix,這將調用原生
fsync()
函數;在 Windows,則是 MS_commit()
函數。如果要寫(xiě)入的是緩沖區內的 Python 文件對象 f,請先執行
f.flush()
,然后執行os.fsync(f.fileno())
,以確保與 f 關(guān)聯(lián)的所有內部緩沖區都寫(xiě)入磁盤(pán)。可用性: Unix, Windows。
- os.ftruncate(fd, length)?
截斷文件描述符 fd 指向的文件,以使其最大為 length 字節。從 Python 3.3 開(kāi)始,它等效于
os.truncate(fd, length)
。引發(fā)一個(gè) 審計事件
os.truncate
,附帶參數fd
,length
。可用性: Unix, Windows。
在 3.5 版更改: 添加了 Windows 支持
- os.get_blocking(fd)?
獲取文件描述符的阻塞模式:如果設置了
O_NONBLOCK
標志位,返回False
,如果該標志位被清除,返回True
。參見(jiàn)
set_blocking()
和socket.socket.setblocking()
。可用性: Unix。
3.5 新版功能.
- os.isatty(fd)?
如果文件描述符 fd 打開(kāi)且已連接至 tty 設備(或類(lèi) tty 設備),返回
True
,否則返回False
。
- os.lockf(fd, cmd, len)?
在打開(kāi)的文件描述符上,使用、測試或刪除 POSIX 鎖。fd 是一個(gè)打開(kāi)的文件描述符。cmd 指定要進(jìn)行的操作,它們是
F_LOCK
、F_TLOCK
、F_ULOCK
或F_TEST
中的一個(gè)。len 指定哪部分文件需要鎖定。引發(fā)一個(gè) 審計事件
os.lockf
,附帶參數fd
、cmd
、len
。可用性: Unix。
3.3 新版功能.
- os.login_tty(fd)?
Prepare the tty of which fd is a file descriptor for a new login session. Make the calling process a session leader; make the tty the controlling tty, the stdin, the stdout, and the stderr of the calling process; close fd.
可用性: Unix。
3.11 新版功能.
- os.lseek(fd, pos, how)?
將文件描述符 fd 的當前位置設置為 pos,位置的計算方式 how 如下:設置為
SEEK_SET
或0
表示從文件開(kāi)頭計算,設置為SEEK_CUR
或1
表示從文件當前位置計算,設置為SEEK_END
或2
表示文件末尾計算。返回新指針位置,這個(gè)位置是從文件開(kāi)頭計算的,單位是字節。
- 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)?
打開(kāi)文件 path,根據 flags 設置各種標志位,并根據 mode 設置其權限狀態(tài)。當計算 mode 時(shí),會(huì )首先根據當前 umask 值將部分權限去除。本方法返回新文件的描述符。新的文件描述符是 不可繼承 的。
有關(guān) flag 和 mode 取值的說(shuō)明,請參見(jiàn) C 運行時(shí)文檔。標志位常量(如
O_RDONLY
和O_WRONLY
)在os
模塊中定義。特別地,在 Windows 上需要添加O_BINARY
才能以二進(jìn)制模式打開(kāi)文件。本函數帶有 dir_fd 參數,支持 基于目錄描述符的相對路徑。
open
附帶參數path
、mode
、flags
會(huì )引發(fā) 審計事件。在 3.4 版更改: 新的文件描述符現在是不可繼承的。
備注
本函數適用于底層的 I/O。常規用途請使用內置函數
open()
,該函數的read()
和write()
方法(及其他方法)會(huì )返回 文件對象。要將文件描述符包裝在文件對象中,請使用fdopen()
。3.3 新版功能: dir_fd 參數。
在 3.5 版更改: 如果系統調用被中斷,但信號處理程序沒(méi)有觸發(fā)異常,此函數現在會(huì )重試系統調用,而不是觸發(fā)
InterruptedError
異常 (原因詳見(jiàn) PEP 475)。在 3.6 版更改: 接受一個(gè) path-like object。
以下常量是 open()
函數 flags 參數的選項??梢杂冒次换蜻\算符 |
將它們組合使用。部分常量并非在所有平臺上都可用。有關(guān)其可用性和用法的說(shuō)明,請參閱 open(2) 手冊(Unix 上)或 MSDN (Windows 上)。
- 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?
這個(gè)常數僅在 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?
這個(gè)常數僅在 Windows 系統中可用。
- os.O_EVTONLY?
- os.O_FSYNC?
- os.O_SYMLINK?
- os.O_NOFOLLOW_ANY?
以上常量?jì)H適用于 macOS。
在 3.10 版更改: 加入
O_EVTONLY
、O_FSYNC
、O_SYMLINK
和O_NOFOLLOW_ANY
常量。
- 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()?
打開(kāi)一對新的偽終端,返回一對文件描述符
(主,從)
,分別為 pty 和 tty。新的文件描述符是 不可繼承 的。對于(稍微)輕量一些的方法,請使用pty
模塊。可用性: 某些 Unix。
在 3.4 版更改: 新的文件描述符不再可繼承。
- os.pipe()?
創(chuàng )建一個(gè)管道,返回一對分別用于讀取和寫(xiě)入的文件描述符
(r, w)
。新的文件描述符是 不可繼承 的。可用性: Unix, Windows。
在 3.4 版更改: 新的文件描述符不再可繼承。
- os.pipe2(flags)?
創(chuàng )建帶有 flags 標志位的管道??赏ㄟ^(guò)對以下一個(gè)或多個(gè)值進(jìn)行“或”運算來(lái)構造這些 flags:
O_NONBLOCK
、O_CLOEXEC
。返回一對分別用于讀取和寫(xiě)入的文件描述符(r, w)
。可用性: 某些 Unix。
3.3 新版功能.
- os.posix_fallocate(fd, offset, len)?
確保為 fd 指向的文件分配了足夠的磁盤(pán)空間,該空間從偏移量 offset 開(kāi)始,到 len 字節為止。
可用性: Unix。
3.3 新版功能.
- os.posix_fadvise(fd, offset, len, advice)?
聲明即將以特定模式訪(fǎng)問(wèn)數據,使內核可以提前進(jìn)行優(yōu)化。數據范圍是從 fd 所指向文件的 offset 開(kāi)始,持續 len 個(gè)字節。advice 的取值是如下之一:
POSIX_FADV_NORMAL
,POSIX_FADV_SEQUENTIAL
,POSIX_FADV_RANDOM
,POSIX_FADV_NOREUSE
,POSIX_FADV_WILLNEED
或POSIX_FADV_DONTNEED
。可用性: Unix。
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 參數的標志位,指定可能使用的訪(fǎng)問(wèn)模式。可用性: Unix。
3.3 新版功能.
- os.pread(fd, n, offset)?
從文件描述符 fd 所指向文件的偏移位置 offset 開(kāi)始,讀取至多 n 個(gè)字節,而保持文件偏移量不變。
返回所讀取字節的字節串 (bytestring)。如果到達了 fd 指向的文件末尾,則返回空字節對象。
可用性: Unix。
3.3 新版功能.
- os.preadv(fd, buffers, offset, flags=0)?
從文件描述符 fd 所指向文件的偏移位置 offset 開(kāi)始,將數據讀取至可變 字節類(lèi)對象 緩沖區 buffers 中,保持文件偏移量不變。將數據依次存放到每個(gè)緩沖區中,填滿(mǎn)一個(gè)后繼續存放到序列中的下一個(gè)緩沖區,來(lái)保存其余數據。
flags 參數可以由零個(gè)或多個(gè)標志位進(jìn)行按位或運算來(lái)得到:
返回實(shí)際讀取的字節總數,該總數可以小于所有對象的總容量。
操作系統可能對允許使用的緩沖區數量有限制(使用
sysconf()
獲取'SC_IOV_MAX'
值)。本方法結合了
os.readv()
和os.pread()
的功能。可用性:Linux 2.6.30 或更高版本,FreeBSD 6.0 或更高版本,OpenBSD 2.7 或更高版本,AIX 7.1 或更高版本。使用標志位需要 Linux 4.6 或更高版本。
3.7 新版功能.
- os.RWF_NOWAIT?
不要等待無(wú)法立即獲得的數據。如果指定了此標志,那么當需要從后備存儲器中讀取數據,或等待文件鎖時(shí),系統調用將立即返回。
如果成功讀取數據,則返回讀取的字節數。如果未讀取到數據,則返回
-1
,并將錯誤碼 errno 置為errno.EAGAIN
。可用性:Linux 4.14 或更高版本。
3.7 新版功能.
- os.RWF_HIPRI?
高優(yōu)先級讀/寫(xiě)。允許基于塊的文件系統對設備進(jìn)行輪詢(xún),這樣可以降低延遲,但可能會(huì )占用更多資源。
目前在 Linux 上,此功能僅在使用
O_DIRECT
標志打開(kāi)的文件描述符上可用。可用性:Linux 4.6 或更高版本。
3.7 新版功能.
- os.pwrite(fd, str, offset)?
將 str 中的字節串 (bytestring) 寫(xiě)入文件描述符 fd 的偏移位置 offset 處,保持文件偏移量不變。
返回實(shí)際寫(xiě)入的字節數。
可用性: Unix。
3.3 新版功能.
- os.pwritev(fd, buffers, offset, flags=0)?
將緩沖區 buffers 的內容寫(xiě)入文件描述符 fd 的偏移位置 offset 處,保持文件偏移量不變。緩沖區 buffers 必須是由 字節類(lèi)對象 組成的序列。緩沖區以數組順序處理。先寫(xiě)入第一個(gè)緩沖區的全部?jì)热?,再?xiě)入第二個(gè)緩沖區,照此繼續。
flags 參數可以由零個(gè)或多個(gè)標志位進(jìn)行按位或運算來(lái)得到:
返回實(shí)際寫(xiě)入的字節總數。
操作系統可能對允許使用的緩沖區數量有限制(使用
sysconf()
獲取'SC_IOV_MAX'
值)。本方法結合了
os.writev()
和os.pwrite()
的功能。可用性:Linux 2.6.30 或更高版本,FreeBSD 6.0 或更高版本,OpenBSD 2.7 或更高版本,AIX 7.1 或更高版本。使用標志位需要 Linux 4.7 或更高版本。
3.7 新版功能.
- os.RWF_DSYNC?
提供預寫(xiě)功能,等效于帶
O_DSYNC
標志的os.open()
。本標志只作用于通過(guò)系統調用寫(xiě)入的數據。可用性:Linux 4.7 或更高版本。
3.7 新版功能.
- os.RWF_SYNC?
提供預寫(xiě)功能,等效于帶
O_SYNC
標志的os.open()
。本標志只作用于通過(guò)系統調用寫(xiě)入的數據。可用性:Linux 4.7 或更高版本。
3.7 新版功能.
- os.RWF_APPEND?
提供預寫(xiě)功能,等效于帶
O_APPEND
標志的os.open()
。本標志只對os.pwritev()
有意義,只作用于通過(guò)系統調用寫(xiě)入的數據。參數 offset 對寫(xiě)入操作無(wú)效;數據總是會(huì )添加到文件的末尾。但如果 offset 參數為-1
,則會(huì )刷新當前文件的 offset 。可用性:Linux 4.16 以上版本。
3.10 新版功能.
- os.read(fd, n)?
從文件描述符 fd 中讀取至多 n 個(gè)字節。
返回所讀取字節的字節串 (bytestring)。如果到達了 fd 指向的文件末尾,則返回空字節對象。
備注
該功能適用于低級 I/O 操作,必須用于
os.open()
或pipe()
返回的文件描述符。若要讀取由內建函數open()
、popen()
、fdopen()
或sys.stdin
返回的 "文件對象",則應使用其相應的read()
或readline()
方法。在 3.5 版更改: 如果系統調用被中斷,但信號處理程序沒(méi)有觸發(fā)異常,此函數現在會(huì )重試系統調用,而不是觸發(fā)
InterruptedError
異常 (原因詳見(jiàn) PEP 475)。
- os.sendfile(out_fd, in_fd, offset, count)?
- os.sendfile(out_fd, in_fd, offset, count, headers=(), trailers=(), flags=0)
將文件描述符 in_fd 中的 count 字節復制到文件描述符 out_fd 的偏移位置 offset 處。返回復制的字節數,如果到達 EOF,返回
0
。定義了
sendfile()
的所有平臺均支持第一種函數用法。在 Linux 上,將 offset 設置為
None
,則從 in_fd 的當前位置開(kāi)始讀取,并更新 in_fd 的位置。第二種情況可以被用于 macOS 和 FreeBSD,其中 headers 和 trailers 是任意的緩沖區序列,它們會(huì )在寫(xiě)入來(lái)自 in_fd 的數據之前被寫(xiě)入。 它的返回內容與第一種情況相同。
在 macOS 和 FreeBSD 上,傳入
0
值作為 count 將指定持續發(fā)送直至到達 in_fd 的末尾。所有平臺都支持將套接字作為 out_fd 文件描述符,有些平臺也支持其他類(lèi)型(如常規文件或管道)。
跨平臺應用程序不應使用 headers、trailers 和 flags 參數。
可用性: Unix。
備注
有關(guān)
sendfile()
的高級封裝,參見(jiàn)socket.socket.sendfile()
。3.3 新版功能.
在 3.9 版更改: out 和 in 參數被重命名為 out_fd 和 in_fd。
- os.set_blocking(fd, blocking)?
設置指定文件描述符的阻塞模式:如果 blocking 為
False
,則為該描述符設置O_NONBLOCK
標志位,反之則清除該標志位。參見(jiàn)
get_blocking()
和socket.socket.setblocking()
。可用性: Unix。
3.5 新版功能.
- os.SF_NODISKIO?
- os.SF_MNOWAIT?
- os.SF_SYNC?
sendfile()
函數的參數(假設當前實(shí)現支持這些參數)。可用性: Unix。
3.3 新版功能.
- os.SF_NOCACHE?
Parameter to the
sendfile()
function, if the implementation supports it. The data won't be cached in the virtual memory and will be freed afterwards.可用性: Unix。
3.11 新版功能.
- os.splice(src, dst, count, offset_src=None, offset_dst=None)?
由文件描述符 src 傳輸 count 字節,從偏移量 offset_src 開(kāi)始讀取,到文件描述符 dst,從偏移量 offset_dst 開(kāi)始寫(xiě)入。至少得有一個(gè)文件描述符必須指向管道。如果 offset_src 為 None,則 src 將從當前位置開(kāi)始讀??;offset_dst 同理。指向管道的文件描述符,其偏移量必須為
None
。 src 和 dst 指向的文件必須處于同一文件系統中,否則將會(huì )觸發(fā)OSError
,其errno
將被設為errno.EXDEV
。此復制的完成沒(méi)有額外的從內核到用戶(hù)空間再回到內核的數據轉移花費。另外,一些文件系統可能實(shí)現額外的優(yōu)化。完成復制就如同打開(kāi)兩個(gè)二進(jìn)制文件一樣。
調用成功后,返回拼接到管道的字節數或從管道拼接出來(lái)的字節數。返回值為 0 意味著(zhù)輸入結束。如果 src 指向一個(gè)管道,則意味著(zhù)沒(méi)有數據需要傳輸,而且由于沒(méi)有寫(xiě)入程序連到管道的寫(xiě)入端,所以將不會(huì )阻塞。
可用性: Linux >= 2.6.27 且 glibc >= 2.5。
3.10 新版功能.
- os.readv(fd, buffers)?
從文件描述符 fd 將數據讀取至多個(gè)可變的 字節類(lèi)對象 緩沖區 buffers 中。將數據依次存放到每個(gè)緩沖區中,填滿(mǎn)一個(gè)后繼續存放到序列中的下一個(gè)緩沖區,來(lái)保存其余數據。
返回實(shí)際讀取的字節總數,該總數可以小于所有對象的總容量。
操作系統可能對允許使用的緩沖區數量有限制(使用
sysconf()
獲取'SC_IOV_MAX'
值)。可用性: Unix。
3.3 新版功能.
- os.tcgetpgrp(fd)?
返回與 fd 指定的終端相關(guān)聯(lián)的進(jìn)程組(fd 是由
os.open()
返回的已打開(kāi)的文件描述符)。可用性: Unix。
- os.tcsetpgrp(fd, pg)?
設置與 fd 指定的終端相關(guān)聯(lián)的進(jìn)程組為 pg*(*fd 是由
os.open()
返回的已打開(kāi)的文件描述符)。可用性: Unix。
- os.ttyname(fd)?
返回一個(gè)字符串,該字符串表示與文件描述符 fd 關(guān)聯(lián)的終端。如果 fd 沒(méi)有與終端關(guān)聯(lián),則拋出異常。
可用性: Unix。
- os.write(fd, str)?
將 str 中的字節串 (bytestring) 寫(xiě)入文件描述符 fd。
返回實(shí)際寫(xiě)入的字節數。
備注
該功能適用于低級 I/O 操作,必須用于
os.open()
或pipe()
返回的文件描述符。若要寫(xiě)入由內建函數open()
、popen()
、fdopen()
、sys.stdout
或sys.stderr
返回的 "文件對象",則應使用其相應的write()
方法。在 3.5 版更改: 如果系統調用被中斷,但信號處理程序沒(méi)有觸發(fā)異常,此函數現在會(huì )重試系統調用,而不是觸發(fā)
InterruptedError
異常 (原因詳見(jiàn) PEP 475)。
- os.writev(fd, buffers)?
將緩沖區 buffers 的內容寫(xiě)入文件描述符 fd。緩沖區 buffers 必須是由 字節類(lèi)對象 組成的序列。緩沖區以數組順序處理。先寫(xiě)入第一個(gè)緩沖區的全部?jì)热?,再?xiě)入第二個(gè)緩沖區,照此繼續。
返回實(shí)際寫(xiě)入的字節總數。
操作系統可能對允許使用的緩沖區數量有限制(使用
sysconf()
獲取'SC_IOV_MAX'
值)。可用性: Unix。
3.3 新版功能.
查詢(xún)終端的尺寸?
3.3 新版功能.
- os.get_terminal_size(fd=STDOUT_FILENO)?
返回終端窗口的尺寸,格式為
(columns, lines)
,它是類(lèi)型為terminal_size
的元組。可選參數
fd
(默認為STDOUT_FILENO
或標準輸出)指定應查詢(xún)的文件描述符。如果文件描述符未連接到終端,則拋出
OSError
異常。shutil.get_terminal_size()
是供常規使用的高階函數,os.get_terminal_size
是其底層的實(shí)現。可用性: Unix, Windows。
文件描述符的繼承?
3.4 新版功能.
每個(gè)文件描述符都有一個(gè) "inheritable"(可繼承)標志位,該標志位控制了文件描述符是否可以由子進(jìn)程繼承。從 Python 3.4 開(kāi)始,由 Python 創(chuàng )建的文件描述符默認是不可繼承的。
在 UNIX 上,執行新程序時(shí),不可繼承的文件描述符在子進(jìn)程中是關(guān)閉的,其他文件描述符將被繼承。
在 Windows 上,不可繼承的句柄和文件描述符在子進(jìn)程中是關(guān)閉的,但標準流(文件描述符 0、1 和 2 即標準輸入、標準輸出和標準錯誤)是始終繼承的。如果使用 spawn*
函數,所有可繼承的句柄和文件描述符都將被繼承。如果使用 subprocess
模塊,將關(guān)閉除標準流以外的所有文件描述符,并且僅當 close_fds 參數為 False
時(shí)才繼承可繼承的句柄。
- os.get_inheritable(fd)?
獲取指定文件描述符的“可繼承”標志位(為布爾值)。
- os.set_inheritable(fd, inheritable)?
設置指定文件描述符的“可繼承”標志位。
文件和目錄?
在某些 Unix 平臺上,許多函數支持以下一項或多項功能:
指定文件描述符為參數: 通常在
os
模塊中提供給函數的 path 參數必須是表示文件路徑的字符串,但是,某些函數現在可以接受其 path 參數為打開(kāi)文件描述符,該函數將對描述符指向的文件進(jìn)行操作。(對于 POSIX 系統,Python 將調用以f
開(kāi)頭的函數變體(如調用fchdir
而不是chdir
)。)可以用
os.supports_fd
檢查某個(gè)函數在你的平臺上是否支持將 path 參數指定為文件描述符。如果不支持,使用該功能將拋出NotImplementedError
異常。如果該函數還支持 dir_fd 或 follow_symlinks 參數,那么用文件描述符作為 path 后就不能再指定上述參數了。
基于目錄描述符的相對路徑: 如果 dir_fd 不是
None
,它就應該是一個(gè)指向目錄的文件描述符,這時(shí)待操作的 path 應該是相對路徑,相對路徑是相對于前述目錄的。如果 path 是絕對路徑,則 dir_fd 將被忽略。(對于 POSIX 系統,Python 將調用該函數的變體,變體以at
結尾,可能以f
開(kāi)頭(如調用faccessat
而不是access
)。可以用
os.supports_dir_fd
檢查某個(gè)函數在你的平臺上是否支持 dir_fd。如果不支持,使用該功能將拋出NotImplementedError
異常。
不跟蹤符號鏈接: 如果 follow_symlinks 為
False
,并且待操作路徑的最后一個(gè)元素是符號鏈接,則該函數將在符號鏈接本身而不是鏈接所指向的文件上操作。(對于 POSIX 系統,Python 將調用該函數的l...
變體。)可以用
os.supports_follow_symlinks
檢查某個(gè)函數在你的平臺上是否支持 follow_symlinks。如果不支持,使用該功能將拋出NotImplementedError
異常。
- os.access(path, mode, *, dir_fd=None, effective_ids=False, follow_symlinks=True)?
使用 實(shí)際用戶(hù)ID/用戶(hù)組ID 測試對 path 的訪(fǎng)問(wèn)。請注意,大多數測試操作將使用 有效用戶(hù)ID/用戶(hù)組ID,因此可以在 suid/sgid 環(huán)境中運用此例程,來(lái)測試調用用戶(hù)是否具有對 path 的指定訪(fǎng)問(wèn)權限。mode 為
F_OK
時(shí)用于測試 path 是否存在,也可以對R_OK
、W_OK
和X_OK
中的一個(gè)或多個(gè)進(jìn)行“或”運算來(lái)測試指定權限。允許訪(fǎng)問(wèn)則返回True
,否則返回False
。更多信息請參見(jiàn) Unix 手冊頁(yè) access(2)。本函數支持指定 基于目錄描述符的相對路徑 和 不跟蹤符號鏈接。
如果 effective_ids 為
True
,access()
將使用 有效用戶(hù)ID/用戶(hù)組ID 而非 實(shí)際用戶(hù)ID/用戶(hù)組ID 進(jìn)行訪(fǎng)問(wèn)檢查。您的平臺可能不支持 effective_ids,您可以使用os.supports_effective_ids
檢查它是否可用。如果不可用,使用它時(shí)會(huì )拋出NotImplementedError
異常。備注
使用
access()
來(lái)檢查用戶(hù)是否具有某項權限(如打開(kāi)文件的權限),然后再使用open()
打開(kāi)文件,這樣做存在一個(gè)安全漏洞,因為用戶(hù)可能會(huì )在檢查和打開(kāi)文件之間的時(shí)間里做其他操作。推薦使用 EAFP 技術(shù)。如:if os.access("myfile", os.R_OK): with open("myfile") as fp: return fp.read() return "some default data"
最好寫(xiě)成:
try: fp = open("myfile") except PermissionError: return "some default data" else: with fp: return fp.read()
備注
即使
access()
指示 I/O 操作會(huì )成功,但實(shí)際操作仍可能失敗,尤其是對網(wǎng)絡(luò )文件系統的操作,其權限語(yǔ)義可能超出常規的 POSIX 權限位模型。在 3.3 版更改: 添加 dir_fd、effective_ids 和 follow_symlinks 參數。
在 3.6 版更改: 接受一個(gè) path-like object。
- os.chdir(path)?
將當前工作目錄更改為 path。
本函數支持 指定文件描述符為參數。其中,描述符必須指向打開(kāi)的目錄,不能是打開(kāi)的文件。
本函數可以?huà)伋?
OSError
及其子類(lèi)的異常,如FileNotFoundError
、PermissionError
和NotADirectoryError
異常。引發(fā)一個(gè) 審計事件
os.chdir
,附帶參數path
。3.3 新版功能: 在某些平臺上新增支持將 path 參數指定為文件描述符。
在 3.6 版更改: 接受一個(gè) path-like object。
- os.chflags(path, flags, *, follow_symlinks=True)?
將 path 的 flags 設置為其他由數字表示的 flags。flags 可以用以下值按位或組合起來(lái)(以下值在
stat
模塊中定義):本函數支持 不跟蹤符號鏈接。
引發(fā)一個(gè) 審計事件
os.chflags
,附帶參數path
、flags
。可用性: Unix。
3.3 新版功能: follow_symlinks 參數。
在 3.6 版更改: 接受一個(gè) path-like object。
- os.chmod(path, mode, *, dir_fd=None, follow_symlinks=True)?
將 path 的 mode 更改為其他由數字表示的 mode。mode 可以用以下值之一,也可以將它們按位或組合起來(lái)(以下值在
stat
模塊中定義):本函數支持 指定文件描述符、指定基于目錄描述符的相對路徑 和 不跟蹤符號鏈接。
備注
盡管 Windows 支持
chmod()
,但只能用它設置文件的只讀標志(stat.S_IWRITE
和stat.S_IREAD
常量或對應的整數值)。所有其他標志位都會(huì )被忽略。引發(fā)一個(gè) 審計事件
os.chmod
,附帶參數path
、mode
、dir_fd
。3.3 新版功能: 添加了指定 path 為文件描述符的支持,以及 dir_fd 和 follow_symlinks 參數。
在 3.6 版更改: 接受一個(gè) path-like object。
- os.chown(path, uid, gid, *, dir_fd=None, follow_symlinks=True)?
將 path 的用戶(hù)和組 ID 分別修改為數字形式的 uid 和 gid。若要使其中某個(gè) ID 保持不變,請將其置為 -1。
本函數支持 指定文件描述符、指定基于目錄描述符的相對路徑 和 不跟蹤符號鏈接。
參見(jiàn)更高階的函數
shutil.chown()
,除了數字 ID 之外,它也接受名稱(chēng)。引發(fā)一個(gè) 審計事件
os.chown
,附帶參數path
、uid
、gid
、dir_fd
。可用性: Unix。
3.3 新版功能: 添加了指定 path 為文件描述符的支持,以及 dir_fd 和 follow_symlinks 參數。
在 3.6 版更改: 支持 類(lèi)路徑對象。
- os.chroot(path)?
將當前進(jìn)程的根目錄更改為 path。
可用性: Unix。
在 3.6 版更改: 接受一個(gè) path-like object。
- os.fchdir(fd)?
將當前工作目錄更改為文件描述符 fd 指向的目錄。fd 必須指向打開(kāi)的目錄而非文件。從 Python 3.3 開(kāi)始,它等效于
os.chdir(fd)
。引發(fā)一個(gè) 審計事件
os.chdir
,附帶參數path
。可用性: Unix。
- os.getcwd()?
返回表示當前工作目錄的字符串。
- os.getcwdb()?
返回表示當前工作目錄的字節串 (bytestring)。
在 3.8 版更改: 在 Windows 上,本函數現在會(huì )使用 UTF-8 編碼格式而不是 ANSI 代碼頁(yè):請參看 PEP 529 了解具體原因。 該函數在 Windows 上不再被棄用。
- os.lchflags(path, flags)?
將 path 的 flags 設置為其他由數字表示的 flags,與
chflags()
類(lèi)似,但不跟蹤符號鏈接。從 Python 3.3 開(kāi)始,它等效于os.chflags(path, flags, follow_symlinks=False)
。引發(fā)一個(gè) 審計事件
os.chflags
,附帶參數path
、flags
。可用性: Unix。
在 3.6 版更改: 接受一個(gè) path-like object。
- os.lchmod(path, mode)?
將 path 的權限狀態(tài)修改為 mode。如果 path 是符號鏈接,則影響符號鏈接本身而非鏈接目標??梢詤⒖?
chmod()
中列出 mode 的可用值。從 Python 3.3 開(kāi)始,它等效于os.chmod(path, mode, follow_symlinks=False)
。引發(fā)一個(gè) 審計事件
os.chmod
,附帶參數path
、mode
、dir_fd
。可用性: Unix。
在 3.6 版更改: 接受一個(gè) path-like object。
- os.lchown(path, uid, gid)?
將 path 的用戶(hù)和組 ID 分別修改為數字形式的 uid 和 gid,本函數不跟蹤符號鏈接。從 Python 3.3 開(kāi)始,它等效于
os.chown(path, uid, gid, follow_symlinks=False)
。引發(fā)一個(gè) 審計事件
os.chown
,附帶參數path
、uid
、gid
、dir_fd
。可用性: Unix。
在 3.6 版更改: 接受一個(gè) path-like object。
- os.link(src, dst, *, src_dir_fd=None, dst_dir_fd=None, follow_symlinks=True)?
創(chuàng )建一個(gè)指向 src 的硬鏈接,名為 dst。
本函數支持將 src_dir_fd 和 dst_dir_fd 中的一個(gè)或兩個(gè)指定為 基于目錄描述符的相對路徑,支持 不跟蹤符號鏈接。
引發(fā)一個(gè) 審計事件
os.link
附帶參數src
、dst
、src_dir_fd
、dst_dir_fd
。可用性: Unix, Windows。
在 3.2 版更改: 添加了對 Windows 的支持。
3.3 新版功能: 添加 src_dir_fd、dst_dir_fd 和 follow_symlinks 參數。
在 3.6 版更改: 接受一個(gè) 類(lèi)路徑對象 作為 src 和 dst。
- os.listdir(path='.')?
返回一個(gè)包含由 path 指定目錄中條目名稱(chēng)組成的列表。 該列表按任意順序排列,并且不包括特殊條目
'.'
和'..'
,即使它們存在于目錄中。 如果有文件在調用此函數期間在被移除或添加到目錄中,是否要包括該文件的名稱(chēng)并沒(méi)有規定。path 可以是 類(lèi)路徑對象。如果 path 是(直接傳入或通過(guò)
PathLike
接口間接傳入)bytes
類(lèi)型,則返回的文件名也將是bytes
類(lèi)型,其他情況下是str
類(lèi)型。本函數也支持 指定文件描述符為參數,其中描述符必須指向目錄。
引發(fā)一個(gè) 審計事件
os.listdir
,附帶參數path
。備注
要將
str
類(lèi)型的文件名編碼為bytes
,請使用fsencode()
。參見(jiàn)
scandir()
函數返回目錄內文件名的同時(shí),也返回文件屬性信息,它在某些具體情況下能提供更好的性能。在 3.2 版更改: path 變?yōu)榭蛇x參數。
3.3 新版功能: 新增支持將 path 參數指定為打開(kāi)的文件描述符。
在 3.6 版更改: 接受一個(gè) path-like object。
- os.lstat(path, *, dir_fd=None)?
在給定路徑上執行本函數,其操作相當于
lstat()
系統調用,類(lèi)似于stat()
但不跟蹤符號鏈接。返回值是stat_result
對象。在不支持符號鏈接的平臺上,本函數是
stat()
的別名。從 Python 3.3 起,此功能等價(jià)于
os.stat(path, dir_fd=dir_fd, follow_symlinks=False)
。本函數支持 基于目錄描述符的相對路徑。
參見(jiàn)
stat()
函數。在 3.2 版更改: 添加對 Windows 6.0 (Vista) 符號鏈接的支持。
在 3.3 版更改: 添加了 dir_fd 參數。
在 3.6 版更改: 接受一個(gè) path-like object。
在 3.8 版更改: 目前在 Windows 上,遇到表示另一個(gè)路徑的重解析點(diǎn)(即名稱(chēng)代理,包括符號鏈接和目錄結點(diǎn)),本函數將打開(kāi)它。其他種類(lèi)的重解析點(diǎn)由
stat()
交由操作系統解析。
- os.mkdir(path, mode=0o777, *, dir_fd=None)?
創(chuàng )建一個(gè)名為 path 的目錄,應用以數字表示的權限模式 mode。
If the directory already exists,
FileExistsError
is raised. If a parent directory in the path does not exist,FileNotFoundError
is raised.某些系統會(huì )忽略 mode。如果沒(méi)有忽略它,那么將首先從它中減去當前的 umask 值。如果除最后 9 位(即 mode 八進(jìn)制的最后 3 位)之外,還設置了其他位,則其他位的含義取決于各個(gè)平臺。在某些平臺上,它們會(huì )被忽略,應顯式調用
chmod()
進(jìn)行設置。本函數支持 基于目錄描述符的相對路徑。
如果需要創(chuàng )建臨時(shí)目錄,請參閱
tempfile
模塊中的tempfile.mkdtemp()
函數。引發(fā)一個(gè) 審計事件
os.mkdir
,附帶參數path
、mode
、dir_fd
。3.3 新版功能: dir_fd 參數。
在 3.6 版更改: 接受一個(gè) path-like object。
- os.makedirs(name, mode=0o777, exist_ok=False)?
遞歸目錄創(chuàng )建函數。與
mkdir()
類(lèi)似,但會(huì )自動(dòng)創(chuàng )建到達最后一級目錄所需要的中間目錄。mode 參數會(huì )傳遞給
mkdir()
,用來(lái)創(chuàng )建最后一級目錄,對于該參數的解釋?zhuān)垍㈤?mkdir() 中的描述。要設置某些新建的父目錄的權限,可以在調用makedirs()
之前設置 umask?,F有父目錄的權限不會(huì )更改。If exist_ok is
False
(the default), aFileExistsError
is raised if the target directory already exists.備注
如果要創(chuàng )建的路徑元素包含
pardir
(如 UNIX 系統中的 "..")makedirs()
將無(wú)法明確目標。本函數能正確處理 UNC 路徑。
引發(fā)一個(gè) 審計事件
os.mkdir
,附帶參數path
、mode
、dir_fd
。3.2 新版功能: exist_ok 參數。
在 3.4.1 版更改: 在 Python 3.4.1 以前,如果 exist_ok 為
True
,且目錄已存在,且 mode 與現有目錄的權限不匹配,makedirs()
仍會(huì )拋出錯誤。由于無(wú)法安全地實(shí)現此行為,因此在 Python 3.4.1 中將該行為刪除。請參閱 bpo-21082。在 3.6 版更改: 接受一個(gè) path-like object。
在 3.7 版更改: mode 參數不再影響新創(chuàng )建的中間目錄的權限。
- os.mkfifo(path, mode=0o666, *, dir_fd=None)?
創(chuàng )建一個(gè)名為 path 的 FIFO(命名管道,一種先進(jìn)先出隊列),具有以數字表示的權限狀態(tài) mode。將從 mode 中首先減去當前的 umask 值。
本函數支持 基于目錄描述符的相對路徑。
FIFO 是可以像常規文件一樣訪(fǎng)問(wèn)的管道。FIFO 如果沒(méi)有被刪除(如使用
os.unlink()
),會(huì )一直存在。通常,FIFO 用作“客戶(hù)端”和“服務(wù)器”進(jìn)程之間的匯合點(diǎn):服務(wù)器打開(kāi) FIFO 進(jìn)行讀取,而客戶(hù)端打開(kāi) FIFO 進(jìn)行寫(xiě)入。請注意,mkfifo()
不會(huì )打開(kāi) FIFO --- 它只是創(chuàng )建匯合點(diǎn)。可用性: Unix。
3.3 新版功能: dir_fd 參數。
在 3.6 版更改: 接受一個(gè) path-like object。
- os.mknod(path, mode=0o600, device=0, *, dir_fd=None)?
創(chuàng )建一個(gè)名為 path 的文件系統節點(diǎn)(文件,設備專(zhuān)用文件或命名管道)。mode 指定權限和節點(diǎn)類(lèi)型,方法是將權限與下列節點(diǎn)類(lèi)型
stat.S_IFREG
、stat.S_IFCHR
、stat.S_IFBLK
和stat.S_IFIFO
之一(按位或)組合(這些常量可以在stat
模塊中找到)。對于stat.S_IFCHR
和stat.S_IFBLK
,device 參數指定了新創(chuàng )建的設備專(zhuān)用文件(可能會(huì )用到os.makedev()
),否則該參數將被忽略。本函數支持 基于目錄描述符的相對路徑。
可用性: Unix。
3.3 新版功能: dir_fd 參數。
在 3.6 版更改: 接受一個(gè) path-like object。
- os.major(device)?
提取主設備號,提取自原始設備號(通常是
stat
中的st_dev
或st_rdev
字段)。
- os.minor(device)?
提取次設備號,提取自原始設備號(通常是
stat
中的st_dev
或st_rdev
字段)。
- os.makedev(major, minor)?
將主設備號和次設備號組合成原始設備號。
- os.pathconf(path, name)?
返回所給名稱(chēng)的文件有關(guān)的系統配置信息。name 指定要查找的配置名稱(chēng),它可以是字符串,是一個(gè)系統已定義的名稱(chēng),這些名稱(chēng)定義在不同標準(POSIX.1,Unix 95,Unix 98 等)中。一些平臺還定義了額外的其他名稱(chēng)。當前操作系統已定義的名稱(chēng)在
pathconf_names
字典中給出。對于未包含在該映射中的配置名稱(chēng),也可以傳遞一個(gè)整數作為 name。如果 name 是一個(gè)字符串且不是已定義的名稱(chēng),將拋出
ValueError
異常。如果當前系統不支持 name 指定的配置名稱(chēng),即使該名稱(chēng)存在于pathconf_names
,也會(huì )拋出OSError
異常,錯誤碼為errno.EINVAL
。本函數支持 指定文件描述符為參數。
可用性: Unix。
在 3.6 版更改: 接受一個(gè) path-like object。
- os.pathconf_names?
字典,表示映射關(guān)系,為
pathconf()
和fpathconf()
可接受名稱(chēng)與操作系統為這些名稱(chēng)定義的整數值之間的映射。這可用于判斷系統已定義了哪些名稱(chēng)。可用性: Unix。
- os.readlink(path, *, dir_fd=None)?
返回一個(gè)字符串,為符號鏈接指向的實(shí)際路徑。其結果可以是絕對或相對路徑。如果是相對路徑,則可用
os.path.join(os.path.dirname(path), result)
轉換為絕對路徑。如果 path 是字符串對象(直接傳入或通過(guò)
PathLike
接口間接傳入),則結果也將是字符串對象,且此類(lèi)調用可能會(huì )引發(fā) UnicodeDecodeError。如果 path 是字節對象(直接傳入或間接傳入),則結果將會(huì )是字節對象。本函數支持 基于目錄描述符的相對路徑。
當嘗試解析的路徑可能含有鏈接時(shí),請改用
realpath()
以正確處理遞歸和平臺差異。可用性: Unix, Windows。
在 3.2 版更改: 添加對 Windows 6.0 (Vista) 符號鏈接的支持。
3.3 新版功能: dir_fd 參數。
在 3.6 版更改: 在 Unix 上可以接受一個(gè) 類(lèi)路徑對象。
在 3.8 版更改: 在 Windows 上接受 類(lèi)路徑對象 和字節對象。
在 3.8 版更改: 增加了對目錄鏈接的支持,且返回值改為了“替換路徑”的形式(通常帶有
\\?\
前綴),而不是先前那樣返回可選的 "print name" 字段。
- os.remove(path, *, dir_fd=None)?
移除(刪除)文件 path。 如果 path 是目錄,則會(huì )引發(fā)
IsADirectoryError
。 請使用rmdir()
來(lái)刪除目錄。 如果文件不存在,則會(huì )引發(fā)FileNotFoundError
。本函數支持 基于目錄描述符的相對路徑。
在 Windows 上,嘗試刪除正在使用的文件會(huì )拋出異常。而在 Unix 上,雖然該文件的條目會(huì )被刪除,但分配給文件的存儲空間仍然不可用,直到原始文件不再使用為止。
本函數在語(yǔ)義上與
unlink()
相同。引發(fā)一個(gè) 審計事件
os.remove
,附帶參數path
、dir_fd
。3.3 新版功能: dir_fd 參數。
在 3.6 版更改: 接受一個(gè) path-like object。
- os.removedirs(name)?
遞歸刪除目錄。工作方式類(lèi)似于
rmdir()
,不同之處在于,如果成功刪除了末尾一級目錄,removedirs()
會(huì )嘗試依次刪除 path 中提到的每個(gè)父目錄,直到拋出錯誤為止(但該錯誤會(huì )被忽略,因為這通常表示父目錄不是空目錄)。例如,os.removedirs('foo/bar/baz')
將首先刪除目錄'foo/bar/baz'
,然后如果'foo/bar'
和'foo'
為空,則繼續刪除它們。如果無(wú)法成功刪除末尾一級目錄,則拋出OSError
異常。引發(fā)一個(gè) 審計事件
os.remove
,附帶參數path
、dir_fd
。在 3.6 版更改: 接受一個(gè) path-like object。
- os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)?
將文件或目錄 src 重命名為 dst。如果 dst 已存在,則下列情況下將會(huì )操作失敗,并拋出
OSError
的子類(lèi):在 Windows 上,如果 dst 已存在,則拋出
FileExistsError
異常。在 Unix 上,如果 src 是文件而 dst 是目錄,將拋出
IsADirectoryError
異常,反之則拋出NotADirectoryError
異常。如果兩者都是目錄且 dst 為空,則 dst 將被靜默替換。如果 dst 是非空目錄,則拋出OSError
異常。如果兩者都是文件,則在用戶(hù)具有權限的情況下,將對 dst 進(jìn)行靜默替換。如果 src 和 dst 在不同的文件系統上,則本操作在某些 Unix 分支上可能會(huì )失敗。如果成功,重命名操作將是一個(gè)原子操作(這是 POSIX 的要求)。本函數支持將 src_dir_fd 和 dst_dir_fd 中的一個(gè)或兩個(gè)指定為 基于目錄描述符的相對路徑。
如果需要在不同平臺上都能替換目標,請使用
replace()
。引發(fā)一個(gè) 審計事件
os.rename
附帶參數src
、dst
、src_dir_fd
、dst_dir_fd
。3.3 新版功能: src_dir_fd 和 dst_dir_fd 參數。
在 3.6 版更改: 接受一個(gè) 類(lèi)路徑對象 作為 src 和 dst。
- os.renames(old, new)?
遞歸重命名目錄或文件。工作方式類(lèi)似
rename()
,除了會(huì )首先創(chuàng )建新路徑所需的中間目錄。重命名后,將調用removedirs()
刪除舊路徑中不需要的目錄。備注
如果用戶(hù)沒(méi)有權限刪除末級的目錄或文件,則本函數可能會(huì )無(wú)法建立新的目錄結構。
引發(fā)一個(gè) 審計事件
os.rename
附帶參數src
、dst
、src_dir_fd
、dst_dir_fd
。在 3.6 版更改: 接受一個(gè) 類(lèi)路徑對象 作為 old 和 new。
- os.replace(src, dst, *, src_dir_fd=None, dst_dir_fd=None)?
Rename the file or directory src to dst. If dst is a non-empty directory,
OSError
will be raised. If dst exists and is a file, it will be replaced silently if the user has permission. The operation may fail if src and dst are on different filesystems. If successful, the renaming will be an atomic operation (this is a POSIX requirement).本函數支持將 src_dir_fd 和 dst_dir_fd 中的一個(gè)或兩個(gè)指定為 基于目錄描述符的相對路徑。
引發(fā)一個(gè) 審計事件
os.rename
附帶參數src
、dst
、src_dir_fd
、dst_dir_fd
。3.3 新版功能.
在 3.6 版更改: 接受一個(gè) 類(lèi)路徑對象 作為 src 和 dst。
- os.rmdir(path, *, dir_fd=None)?
Remove (delete) the directory path. If the directory does not exist or is not empty, a
FileNotFoundError
or anOSError
is raised respectively. In order to remove whole directory trees,shutil.rmtree()
can be used.本函數支持 基于目錄描述符的相對路徑。
引發(fā)一個(gè) 審計事件
os.rmdir
,附帶參數path
、dir_fd
。3.3 新版功能: dir_fd 參數。
在 3.6 版更改: 接受一個(gè) path-like object。
- os.scandir(path='.')?
返回一個(gè)
os.DirEntry
對象的迭代器,它們對應于由 path 指定目錄中的條目。 這些條目會(huì )以任意順序生成,并且不包括特殊條目'.'
和'..'
。 如果有文件在迭代器創(chuàng )建之后在目錄中被移除或添加,是否要包括該文件對應的條目并沒(méi)有規定。如果需要文件類(lèi)型或文件屬性信息,使用
scandir()
代替listdir()
可以大大提高這部分代碼的性能,因為如果操作系統在掃描目錄時(shí)返回的是os.DirEntry
對象,則該對象包含了這些信息。所有os.DirEntry
的方法都可能執行一次系統調用,但是is_dir()
和is_file()
通常只在有符號鏈接時(shí)才執行一次系統調用。os.DirEntry.stat()
在 Unix 上始終需要一次系統調用,而在 Windows 上只在有符號鏈接時(shí)才需要。path 可以是 類(lèi)路徑對象。如果 path 是(直接傳入或通過(guò)
PathLike
接口間接傳入的)bytes
類(lèi)型,那么每個(gè)os.DirEntry
的name
和path
屬性將是bytes
類(lèi)型,其他情況下是str
類(lèi)型。本函數也支持 指定文件描述符為參數,其中描述符必須指向目錄。
引發(fā)一個(gè) 審計事件
os.scandir
,附帶參數path
。scandir()
迭代器支持 上下文管理 協(xié)議,并具有以下方法:- scandir.close()?
關(guān)閉迭代器并釋放占用的資源。
當迭代器迭代完畢,或垃圾回收,或迭代過(guò)程出錯時(shí),將自動(dòng)調用本方法。但仍建議顯式調用它或使用
with
語(yǔ)句。3.6 新版功能.
下面的例子演示了
scandir()
的簡(jiǎn)單用法,用來(lái)顯示給定 path 中所有不以'.'
開(kāi)頭的文件(不包括目錄)。entry.is_file()
通常不會(huì )增加一次額外的系統調用: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 新版功能: 添加了對 上下文管理 協(xié)議和
close()
方法的支持。如果scandir()
迭代器沒(méi)有迭代完畢且沒(méi)有顯式關(guān)閉,其析構函數將發(fā)出ResourceWarning
警告。本函數接受一個(gè) 類(lèi)路徑對象。
在 3.7 版更改: 在 Unix 上新增支持 指定文件描述符為參數。
- class os.DirEntry?
由
scandir()
生成的對象,用于顯示目錄內某個(gè)條目的文件路徑和其他文件屬性。scandir()
將在不進(jìn)行額外系統調用的情況下,提供盡可能多的此類(lèi)信息。每次進(jìn)行stat()
或lstat()
系統調用時(shí),os.DirEntry
對象會(huì )將結果緩存下來(lái)。os.DirEntry
實(shí)例不適合存儲在長(cháng)期存在的數據結構中,如果你知道文件元數據已更改,或者自調用scandir()
以來(lái)已經(jīng)經(jīng)過(guò)了很長(cháng)時(shí)間,請調用os.stat(entry.path)
來(lái)獲取最新信息。因為
os.DirEntry
方法可以進(jìn)行系統調用,所以它也可能拋出OSError
異常。如需精確定位錯誤,可以逐個(gè)調用os.DirEntry
中的方法來(lái)捕獲OSError
,并適當處理。為了能直接用作 類(lèi)路徑對象,
os.DirEntry
實(shí)現了PathLike
接口。os.DirEntry
實(shí)例所包含的屬性和方法如下:- name?
本條目的基本文件名,是根據
scandir()
的 path 參數得出的相對路徑。如果
scandir()
的 path 參數是bytes
類(lèi)型,則name
屬性也是bytes
類(lèi)型,否則為str
。使用fsdecode()
解碼 byte 類(lèi)型的文件名。
- path?
本條目的完整路徑:等效于
os.path.join(scandir_path, entry.name)
,其中 scandir_path 就是scandir()
的 path 參數。僅當scandir()
的 path 參數為絕對路徑時(shí),本路徑才是絕對路徑。如果scandir()
的 path 參數是 文件描述符,則path
屬性與上述name
屬性相同。如果
scandir()
的 path 參數是bytes
類(lèi)型,則path
屬性也是bytes
類(lèi)型,否則為str
。使用fsdecode()
解碼 byte 類(lèi)型的文件名。
- inode()?
返回本條目的索引節點(diǎn)號 (inode number)。
這一結果是緩存在
os.DirEntry
對象中的,請調用os.stat(entry.path, follow_symlinks=False).st_ino
來(lái)獲取最新信息。一開(kāi)始沒(méi)有緩存時(shí),在 Windows 上需要一次系統調用,但在 Unix 上不需要。
- is_dir(*, follow_symlinks=True)?
如果本條目是目錄,或是指向目錄的符號鏈接,則返回
True
。如果本條目是文件,或指向任何其他類(lèi)型的文件,或該目錄不再存在,則返回False
。如果 follow_symlinks 是
False
,那么僅當本條目為目錄時(shí)返回True
(不跟蹤符號鏈接),如果本條目是任何類(lèi)型的文件,或該文件不再存在,則返回False
。這一結果是緩存在
os.DirEntry
對象中的,且 follow_symlinks 為True
和False
時(shí)的緩存是分開(kāi)的。請調用os.stat()
和stat.S_ISDIR()
來(lái)獲取最新信息。一開(kāi)始沒(méi)有緩存時(shí),大多數情況下不需要系統調用。特別是對于非符號鏈接,Windows 和 Unix 都不需要系統調用,除非某些 Unix 文件系統(如網(wǎng)絡(luò )文件系統)返回了
dirent.d_type == DT_UNKNOWN
。如果本條目是符號鏈接,則需要一次系統調用來(lái)跟蹤它(除非 follow_symlinks 為False
)。本方法可能拋出
OSError
異常,如PermissionError
異常,但FileNotFoundError
異常會(huì )被內部捕獲且不會(huì )拋出。
- is_file(*, follow_symlinks=True)?
如果本條目是文件,或是指向文件的符號鏈接,則返回
True
。如果本條目是目錄,或指向目錄,或指向其他非文件條目,或該文件不再存在,則返回False
。如果 follow_symlinks 是
False
,那么僅當本條目為文件時(shí)返回True
(不跟蹤符號鏈接),如果本條目是目錄或其他非文件條目,或該文件不再存在,則返回False
。這一結果是緩存在
os.DirEntry
對象中的。緩存、系統調用、異常拋出都與is_dir()
一致。
- is_symlink()?
如果本條目是符號鏈接(即使是斷開(kāi)的鏈接),返回
True
。如果是目錄或任何類(lèi)型的文件,或本條目不再存在,返回False
。這一結果是緩存在
os.DirEntry
對象中的,請調用os.path.islink()
來(lái)獲取最新信息。一開(kāi)始沒(méi)有緩存時(shí),大多數情況下不需要系統調用。其實(shí) Windows 和 Unix 都不需要系統調用,除非某些 Unix 文件系統(如網(wǎng)絡(luò )文件系統)返回了
dirent.d_type == DT_UNKNOWN
。本方法可能拋出
OSError
異常,如PermissionError
異常,但FileNotFoundError
異常會(huì )被內部捕獲且不會(huì )拋出。
- stat(*, follow_symlinks=True)?
返回本條目對應的
stat_result
對象。本方法默認會(huì )跟蹤符號鏈接,要獲取符號鏈接本身的 stat,請添加follow_symlinks=False
參數。在 Unix 上,本方法需要一次系統調用。在 Windows 上,僅在 follow_symlinks 為
True
且該條目是一個(gè)重解析點(diǎn)(如符號鏈接或目錄結點(diǎn))時(shí),才需要一次系統調用。在 Windows 上,
stat_result
的st_ino
、st_dev
和st_nlink
屬性總是為零。請調用os.stat()
以獲得這些屬性。這一結果是緩存在
os.DirEntry
對象中的,且 follow_symlinks 為True
和False
時(shí)的緩存是分開(kāi)的。請調用os.stat()
來(lái)獲取最新信息。
注意,
os.DirEntry
和pathlib.Path
的幾個(gè)屬性和方法之間存在很好的對應關(guān)系。具體來(lái)說(shuō)是name
屬性,以及is_dir()
、is_file()
、is_symlink()
和stat()
方法,在兩個(gè)類(lèi)中具有相同的含義。3.5 新版功能.
- os.stat(path, *, dir_fd=None, follow_symlinks=True)?
獲取文件或文件描述符的狀態(tài)。在所給路徑上執行等效于
stat()
系統調用的操作。path 可以是字符串類(lèi)型,或(直接傳入或通過(guò)PathLike
接口間接傳入的) bytes 類(lèi)型,或打開(kāi)的文件描述符。返回一個(gè)stat_result
對象。本函數默認會(huì )跟蹤符號鏈接,要獲取符號鏈接本身的 stat,請添加
follow_symlinks=False
參數,或使用lstat()
。本函數支持 指定文件描述符為參數 和 不跟蹤符號鏈接。
在 Windows 上,傳入
follow_symlinks=False
將禁用所有名稱(chēng)代理重解析點(diǎn),其中包括符號鏈接和目錄結點(diǎn)。其他類(lèi)型的重解析點(diǎn)將直接打開(kāi),比如不像鏈接的或系統無(wú)法跟蹤的重解析點(diǎn)。當多個(gè)鏈接形成一個(gè)鏈時(shí),本方法可能會(huì )返回原始鏈接的 stat,無(wú)法完整遍歷到非鏈接的對象。在這種情況下,要獲取最終路徑的 stat,請使用os.path.realpath()
函數盡可能地解析路徑,并在解析結果上調用lstat()
。這不適用于空鏈接或交接點(diǎn),否則會(huì )拋出異常。示例:
>>> 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 版更改: 接受一個(gè) path-like object。
在 3.8 版更改: 在 Windows 上,本方法將跟蹤系統能解析的所有重解析點(diǎn),并且傳入
follow_symlinks=False
會(huì )停止跟蹤所有名稱(chēng)代理重解析點(diǎn)?,F在,如果操作系統遇到無(wú)法跟蹤的重解析點(diǎn),stat 將返回原始路徑的信息,就像已指定follow_symlinks=False
一樣,而不會(huì )拋出異常。
- class os.stat_result?
本對象的屬性大致對應于
stat
結構體成員,主要作為os.stat()
、os.fstat()
和os.lstat()
的返回值。屬性:
- st_mode?
文件模式:包括文件類(lèi)型和文件模式位(即權限位)。
- st_ino?
與平臺有關(guān),但如果不為零,則根據
st_dev
值唯一地標識文件。通常:在 Unix 上該值表示索引節點(diǎn)號 (inode number)。
在 Windows 上該值表示 文件索引號 。
- st_dev?
該文件所在設備的標識符。
- st_nlink?
硬鏈接的數量。
- st_uid?
文件所有者的用戶(hù) ID。
- st_gid?
文件所有者的用戶(hù)組 ID。
- st_size?
文件大?。ㄒ宰止潪閱挝唬?,文件可以是常規文件或符號鏈接。符號鏈接的大小是它包含的路徑的長(cháng)度,不包括末尾的空字節。
時(shí)間戳:
- st_atime?
最近的訪(fǎng)問(wèn)時(shí)間,以秒為單位。
- st_mtime?
最近的修改時(shí)間,以秒為單位。
- st_ctime?
取決于平臺:
在 Unix 上表示最近的元數據更改時(shí)間,
在 Windows 上表示創(chuàng )建時(shí)間,以秒為單位。
- st_atime_ns?
最近的訪(fǎng)問(wèn)時(shí)間,以納秒表示,為整數。
- st_mtime_ns?
最近的修改時(shí)間,以納秒表示,為整數。
- st_ctime_ns?
取決于平臺:
在 Unix 上表示最近的元數據更改時(shí)間,
在 Windows 上表示創(chuàng )建時(shí)間,以納秒表示,為整數。
備注
st_atime
、st_mtime
和st_ctime
屬性的確切含義和分辨率取決于操作系統和文件系統。例如,在使用 FAT 或 FAT32 文件系統的 Windows 上,st_mtime
有 2 秒的分辨率,而st_atime
僅有 1 天的分辨率。詳細信息請參閱操作系統文檔。類(lèi)似地,盡管
st_atime_ns
、st_mtime_ns
和st_ctime_ns
始終以納秒表示,但許多系統并不提供納秒精度。在確實(shí)提供納秒精度的系統上,用于存儲st_atime
、st_mtime
和st_ctime
的浮點(diǎn)對象無(wú)法保留所有精度,因此不夠精確。如果需要確切的時(shí)間戳,則應始終使用st_atime_ns
、st_mtime_ns
和st_ctime_ns
。在某些 Unix 系統上(如 Linux 上),以下屬性可能也可用:
- st_blksize?
“首選的” 塊大小,用于提高文件系統 I/O 效率。寫(xiě)入文件時(shí)塊大小太小可能會(huì )導致讀取-修改-重寫(xiě)效率低下。
- st_rdev?
設備類(lèi)型(如果是 inode 設備)。
- st_flags?
用戶(hù)定義的文件標志位。
在其他 Unix 系統上(如 FreeBSD 上),以下屬性可能可用(但僅當 root 使用它們時(shí)才被填充):
- st_gen?
文件生成號。
- st_birthtime?
文件創(chuàng )建時(shí)間。
在 Solaris 及其衍生版本上,以下屬性可能也可用:
- st_fstype?
文件所在文件系統的類(lèi)型的唯一標識,為字符串。
On macOS systems, the following attributes may also be available:
- st_rsize?
文件的實(shí)際大小。
- st_creator?
文件的創(chuàng )建者。
- st_type?
文件類(lèi)型。
在 Windows 系統上,以下屬性也可用:
- st_file_attributes?
Windows 文件屬性:
dwFileAttributes
,由GetFileInformationByHandle()
返回的BY_HANDLE_FILE_INFORMATION
結構體的成員之一。請參閱stat
模塊中的FILE_ATTRIBUTE_*
常量。
- st_reparse_tag?
當
st_file_attributes
存在FILE_ATTRIBUTE_REPARSE_POINT
集合時(shí),本字段包含重解析點(diǎn)類(lèi)型標記。請參閱stat
模塊中的IO_REPARSE_TAG_*
常量。
標準模塊
stat
中定義了函數和常量,這些函數和常量可用于從stat
結構體中提取信息。(在 Windows 上,某些項填充的是虛值。)為了向后兼容,一個(gè)
stat_result
實(shí)例還可以作為至少包含 10 個(gè)整數的元組訪(fǎng)問(wèn),以提供stat
結構中最重要(和可移植)的成員,整數順序為st_mode
,st_ino
,st_dev
,st_nlink
,st_uid
,st_gid
,st_size
,st_atime
,st_mtime
,st_ctime
。某些實(shí)現可能在末尾還有更多項。為了與舊版 Python 兼容,以元組形式訪(fǎng)問(wèn)stat_result
始終返回整數。3.3 新版功能: 添加了
st_atime_ns
、st_mtime_ns
和st_ctime_ns
成員。3.5 新版功能: 在 Windows 上添加了
st_file_attributes
成員。在 3.5 版更改: 在 Windows 上,如果可用,會(huì )返回文件索引作為
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()
系統調用。返回值是一個(gè)對象,其屬性描述了所給路徑上的文件系統,并且與statvfs
結構體的成員相對應,即:f_bsize
,f_frsize
,f_blocks
,f_bfree
,f_bavail
,f_files
,f_ffree
,f_favail
,f_flag
,f_namemax
,f_fsid
。為
f_flag
屬性位定義了兩個(gè)模塊級常量:如果存在ST_RDONLY
位,則文件系統以只讀掛載;如果存在ST_NOSUID
位,則文件系統禁用或不支持 setuid/setgid 位。為基于 GNU/glibc 的系統還定義了額外的模塊級常量。它們是
ST_NODEV
(禁止訪(fǎng)問(wèn)設備專(zhuān)用文件),ST_NOEXEC
(禁止執行程序),ST_SYNCHRONOUS
(寫(xiě)入后立即同步),ST_MANDLOCK
(允許文件系統上的強制鎖定),ST_WRITE
(寫(xiě)入文件/目錄/符號鏈接),ST_APPEND
(僅追加文件),ST_IMMUTABLE
(不可變文件),ST_NOATIME
(不更新訪(fǎng)問(wèn)時(shí)間),ST_NODIRATIME
(不更新目錄訪(fǎng)問(wèn)時(shí)間),ST_RELATIME
(相對于 mtime/ctime 更新訪(fǎng)問(wèn)時(shí)間)。本函數支持 指定文件描述符為參數。
可用性: Unix。
在 3.2 版更改: 添加了
ST_RDONLY
和ST_NOSUID
常量。3.3 新版功能: 新增支持將 path 參數指定為打開(kāi)的文件描述符。
在 3.4 版更改: 添加了
ST_NODEV
、ST_NOEXEC
、ST_SYNCHRONOUS
、ST_MANDLOCK
、ST_WRITE
、ST_APPEND
、ST_IMMUTABLE
、ST_NOATIME
、ST_NODIRATIME
和ST_RELATIME
常量。在 3.6 版更改: 接受一個(gè) path-like object。
3.7 新版功能: 添加了
f_fsid
。
- os.supports_dir_fd?
一個(gè)
set
對象,指示os
模塊中的哪些函數接受一個(gè)打開(kāi)的文件描述符作為 dir_fd 參數。不同平臺提供的功能不同,且 Python 用于實(shí)現 dir_fd 參數的底層函數并非在 Python 支持的所有平臺上都可用??紤]到一致性,支持 dir_fd 的函數始終允許指定描述符,但如果在底層不支持時(shí)調用了該函數,則會(huì )拋出異常。(在所有平臺上始終支持將 dir_fd 指定為None
。)要檢查某個(gè)函數是否接受打開(kāi)的文件描述符作為 dir_fd 參數,請在
supports_dir_fd
前使用in
運算符。例如,如果os.stat()
在當前平臺上接受打開(kāi)的文件描述符作為 dir_fd 參數,則此表達式的計算結果為True
:os.stat in os.supports_dir_fd
目前 dir_fd 參數僅在 Unix 平臺上有效,在 Windows 上均無(wú)效。
3.3 新版功能.
- os.supports_effective_ids?
一個(gè)
set
對象,指示os.access()
是否允許在當前平臺上將其 effective_ids 參數指定為True
。(所有平臺都支持將 effective_ids 指定為False
。)如果當前平臺支持,則集合將包含os.access()
,否則集合為空。如果當前平臺上的
os.access()
支持effective_ids=True
,則此表達式的計算結果為True
:os.access in os.supports_effective_ids
目前僅 Unix 平臺支持 effective_ids,Windows 不支持。
3.3 新版功能.
- os.supports_fd?
一個(gè)
set
對象,指示在當前平臺上os
模塊中的哪些函數接受一個(gè)打開(kāi)的文件描述符作為 path 參數。不同平臺提供的功能不同,且 Python 所使用到的底層函數(用于實(shí)現接受描述符作為 path)并非在 Python 支持的所有平臺上都可用。要判斷某個(gè)函數是否接受打開(kāi)的文件描述符作為 path 參數,請在
supports_fd
前使用in
運算符。例如,如果os.chdir()
在當前平臺上接受打開(kāi)的文件描述符作為 path 參數,則此表達式的計算結果為True
:os.chdir in os.supports_fd
3.3 新版功能.
- os.supports_follow_symlinks?
一個(gè)
set
對象,指示在當前平臺上os
模塊中的哪些函數的 follow_symlinks 參數可指定為False
。不同平臺提供的功能不同,且 Python 用于實(shí)現 follow_symlinks 的底層函數并非在 Python 支持的所有平臺上都可用??紤]到一致性,支持 follow_symlinks 的函數始終允許將其指定為False
,但如果在底層不支持時(shí)調用了該函數,則會(huì )拋出異常。(在所有平臺上始終支持將 follow_symlinks 指定為True
。)要檢查某個(gè)函數的 follow_symlinks 參數是否可以指定為
False
,請在supports_follow_symlinks
前使用in
運算符。例如,如果在當前平臺上調用os.stat()
時(shí)可以指定follow_symlinks=False
,則此表達式的計算結果為True
:os.stat in os.supports_follow_symlinks
3.3 新版功能.
- os.symlink(src, dst, target_is_directory=False, *, dir_fd=None)?
創(chuàng )建一個(gè)指向 src 的符號鏈接,名為 dst。
在 Windows 上,符號鏈接可以表示文件或目錄兩種類(lèi)型,并且不會(huì )動(dòng)態(tài)改變類(lèi)型。如果目標存在,則新建鏈接的類(lèi)型將與目標一致。否則,如果 target_is_directory 為
True
,則符號鏈接將創(chuàng )建為目錄鏈接,為False
(默認)將創(chuàng )建為文件鏈接。在非 Windows 平臺上,target_is_directory 被忽略。本函數支持 基于目錄描述符的相對路徑。
備注
在 Windows 10 或更高版本上,如果啟用了開(kāi)發(fā)人員模式,非特權帳戶(hù)可以創(chuàng )建符號鏈接。如果開(kāi)發(fā)人員模式不可用/未啟用,則需要 SeCreateSymbolicLinkPrivilege 權限,或者該進(jìn)程必須以管理員身份運行。
當本函數由非特權賬戶(hù)調用時(shí),拋出
OSError
異常。引發(fā)一個(gè) 審計事件
os.symlink
,附帶參數src
、dst
、dir_fd
。可用性: Unix, Windows。
在 3.2 版更改: 添加對 Windows 6.0 (Vista) 符號鏈接的支持。
3.3 新版功能: 添加了 dir_fd 參數,現在在非 Windows 平臺上允許 target_is_directory 參數。
在 3.6 版更改: 接受一個(gè) 類(lèi)路徑對象 作為 src 和 dst。
在 3.8 版更改: 針對啟用了開(kāi)發(fā)人員模式的 Windows,添加了非特權賬戶(hù)創(chuàng )建符號鏈接的支持。
- os.truncate(path, length)?
截斷 path 對應的文件,以使其最大為 length 字節。
本函數支持 指定文件描述符為參數。
引發(fā)一個(gè) 審計事件
os.truncate
,附帶參數path
,length
。可用性: Unix, Windows。
3.3 新版功能.
在 3.5 版更改: 添加了 Windows 支持
在 3.6 版更改: 接受一個(gè) path-like object。
- os.unlink(path, *, dir_fd=None)?
移除(刪除)文件 path。該函數在語(yǔ)義上與
remove()
相同,unlink
是其傳統的 Unix 名稱(chēng)。請參閱remove()
的文檔以獲取更多信息。引發(fā)一個(gè) 審計事件
os.remove
,附帶參數path
、dir_fd
。3.3 新版功能: dir_fd 參數。
在 3.6 版更改: 接受一個(gè) path-like object。
- os.utime(path, times=None, *, [ns, ]dir_fd=None, follow_symlinks=True)?
設置文件 path 的訪(fǎng)問(wèn)時(shí)間和修改時(shí)間。
utime()
有 times 和 ns 兩個(gè)可選參數,它們指定了設置給 path 的時(shí)間,用法如下:如果指定 ns,它必須是一個(gè)
(atime_ns, mtime_ns)
形式的二元組,其中每個(gè)成員都是一個(gè)表示納秒的整數。如果 times 不為
None
,則它必須是(atime, mtime)
形式的二元組,其中每個(gè)成員都是一個(gè)表示秒的 int 或 float。如果 times 為
None
且未指定 ns,則相當于指定ns=(atime_ns, mtime_ns)
,其中兩個(gè)時(shí)間均為當前時(shí)間。
同時(shí)為 times 和 ns 指定元組會(huì )出錯。
注意,根據操作系統記錄訪(fǎng)問(wèn)時(shí)間和修改時(shí)間的分辨率,后續的
stat()
調用可能不會(huì )返回此處設置的確切時(shí)間。請參閱stat()
。保留精確時(shí)間的最佳方法是使用os.stat()
結果對象中的 st_atime_ns 和 st_mtime_ns 字段,并將 ns 參數設置為 utime。本函數支持 指定文件描述符、指定基于目錄描述符的相對路徑 和 不跟蹤符號鏈接。
引發(fā)一個(gè) 審計事件
os.utime
,附帶參數path
、times
、ns
、dir_fd
。3.3 新版功能: 新增支持將 path 參數指定為打開(kāi)的文件描述符,以及支持 dir_fd、follow_symlinks 和 ns 參數。
在 3.6 版更改: 接受一個(gè) path-like object。
- os.walk(top, topdown=True, onerror=None, followlinks=False)?
生成目錄樹(shù)中的文件名,方式是按上->下或下->上順序瀏覽目錄樹(shù)。對于以 top 為根的目錄樹(shù)中的每個(gè)目錄(包括 top 本身),它都會(huì )生成一個(gè)三元組
(dirpath, dirnames, filenames)
。dirpath 是表示目錄路徑的字符串。 dirnames 是 dirpath 中子目錄名稱(chēng)組成的列表 (excluding
'.'
and'..'
)。 filenames 是 dirpath 中非目錄文件名稱(chēng)組成的列表。 請注意列表中的名稱(chēng)不帶路徑部分。 要獲取 dirpath 中文件或目錄的完整路徑(以 top 打頭),請執行os.path.join(dirpath, name)
。 列表是否排序取決于具體文件系統。 如果有文件或列表生成期間被移除或添加到 dirpath 目錄中,是否要包括該文件的名稱(chēng)并沒(méi)有規定。如果可選參數 topdown 為
True
或未指定,則在所有子目錄的三元組之前生成父目錄的三元組(目錄是自上而下生成的)。如果 topdown 為False
,則在所有子目錄的三元組生成之后再生成父目錄的三元組(目錄是自下而上生成的)。無(wú)論 topdown 為何值,在生成目錄及其子目錄的元組之前,都將檢索全部子目錄列表。當 topdown 為
True
時(shí),調用者可以就地修改 dirnames 列表(也許用到了del
或切片),而walk()
將僅僅遞歸到仍保留在 dirnames 中的子目錄內。這可用于減少搜索、加入特定的訪(fǎng)問(wèn)順序,甚至可在繼續walk()
之前告知walk()
由調用者新建或重命名的目錄的信息。當 topdown 為False
時(shí),修改 dirnames 對 walk 的行為沒(méi)有影響,因為在自下而上模式中,dirnames 中的目錄是在 dirpath 本身之前生成的。默認將忽略
scandir()
調用中的錯誤。如果指定了可選參數 onerror,它應該是一個(gè)函數。出錯時(shí)它會(huì )被調用,參數是一個(gè)OSError
實(shí)例。它可以報告錯誤然后繼續遍歷,或者拋出異常然后中止遍歷。注意,可以從異常對象的filename
屬性中獲取出錯的文件名。walk()
默認不會(huì )遞歸進(jìn)指向目錄的符號鏈接??梢栽谥С址栨溄拥南到y上將 followlinks 設置為True
,以訪(fǎng)問(wèn)符號鏈接指向的目錄。備注
注意,如果鏈接指向自身的父目錄,則將 followlinks 設置為
True
可能導致無(wú)限遞歸。walk()
不會(huì )記錄它已經(jīng)訪(fǎng)問(wèn)過(guò)的目錄。下面的示例遍歷起始目錄內所有子目錄,打印每個(gè)目錄內的文件占用的字節數,CVS 子目錄不會(huì )被遍歷:
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
在下一個(gè)示例(
shutil.rmtree()
的簡(jiǎn)單實(shí)現)中,必須使樹(shù)自下而上遍歷,因為rmdir()
只允許在目錄為空時(shí)刪除目錄:# 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))
引發(fā)一個(gè) 審計事件
os.walk
,附帶參數top
,topdown
,onerror
,followlinks
。在 3.5 版更改: 現在,本函數調用的是
os.scandir()
而不是os.listdir()
,從而減少了調用os.stat()
的次數而變得更快。在 3.6 版更改: 接受一個(gè) path-like object。
- os.fwalk(top='.', topdown=True, onerror=None, *, follow_symlinks=False, dir_fd=None)?
本方法的行為與
walk()
完全一樣,除了它產(chǎn)生的是 4 元組(dirpath, dirnames, filenames, dirfd)
,并且它支持dir_fd
。dirpath、dirnames 和 filenames 與
walk()
輸出的相同,dirfd 是指向目錄 dirpath 的文件描述符。本函數始終支持 基于目錄描述符的相對路徑 和 不跟蹤符號鏈接。但是請注意,與其他函數不同,
fwalk()
的 follow_symlinks 的默認值為False
。下面的示例遍歷起始目錄內所有子目錄,打印每個(gè)目錄內的文件占用的字節數,CVS 子目錄不會(huì )被遍歷:
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
在下一個(gè)示例中,必須使樹(shù)自下而上遍歷,因為
rmdir()
只允許在目錄為空時(shí)刪除目錄:# 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)
引發(fā)一個(gè) 審計事件
os.fwalk
,附帶參數top
,topdown
,onerror
,follow_symlinks
,dir_fd
。可用性: Unix。
3.3 新版功能.
在 3.6 版更改: 接受一個(gè) path-like object。
在 3.7 版更改: 添加了對
bytes
類(lèi)型路徑的支持。
- os.memfd_create(name[, flags=os.MFD_CLOEXEC])?
創(chuàng )建一個(gè)匿名文件,返回指向該文件的文件描述符。flags 必須是系統上可用的
os.MFD_*
常量之一(或將它們按位“或”組合起來(lái))。新文件描述符默認是 不可繼承的。name 提供的名稱(chēng)會(huì )被用作文件名,并且
/proc/self/fd/
目錄中相應符號鏈接的目標將顯示為該名稱(chēng)。顯示的名稱(chēng)始終以memfd:
為前綴,并且僅用于調試目的。名稱(chēng)不會(huì )影響文件描述符的行為,因此多個(gè)文件可以有相同的名稱(chēng),不會(huì )有副作用。可用性:Linux 3.17 或更高版本,且裝有 glibc 2.27 或更高版本。
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()
。可用性:Linux 3.17 或更高版本,且裝有 glibc 2.27 或更高版本。
MFD_HUGE*
標志僅在 Linux 4.14 及以上可用。3.8 新版功能.
- os.eventfd(initval[, flags=os.EFD_CLOEXEC])?
創(chuàng )建并返回一個(gè)事件文件描述符。此文件描述符支持緩沖區大小為 8 的原生
read()
和write()
操作、select()
、poll()
等類(lèi)似操作。更多信息請參閱 man 文檔 eventfd(2)。默認情況下,新的文件描述符是 non-inheritable。initval 是事件計數器的初始值。初始值必須是一個(gè) 32 位無(wú)符號整數。請注意,雖然事件計數器是一個(gè)無(wú)符號的 64 位整數,其最大值為 2 64-2,但初始值仍被限制為 32 位無(wú)符號整數。
flags 可由
EFD_CLOEXEC
、EFD_NONBLOCK
和EFD_SEMAPHORE
組合而成。如果設置了
EFD_SEMAPHORE
,并且事件計數器非零,那么eventfd_read()
將返回 1 并將計數器遞減 1。如果未設置
EFD_SEMAPHORE
,并且事件計數器非零,那么eventfd_read()
返回當前的事件計數器值,并將計數器重置為零。如果事件計數器為 0,并且未設置
EFD_NONBLOCK
,那么eventfd_read()
會(huì )阻塞。eventfd_write()
會(huì )遞增事件計數器。如果寫(xiě)操作會(huì )讓計數器的增量大于264-2,則寫(xiě)入會(huì )被阻止。示例:
import os # semaphore with start value '1' fd = os.eventfd(1, os.EFD_SEMAPHORE | os.EFC_CLOEXEC) try: # acquire semaphore v = os.eventfd_read(fd) try: do_work() finally: # release semaphore os.eventfd_write(fd, v) finally: os.close(fd)
可用性 :Linux 2.6.27 以上版本,帶有 glibc 2.8 以上版本。
3.10 新版功能.
- os.eventfd_read(fd)?
從一個(gè)
eventfd()
文件描述符中讀取數據,并返回一個(gè) 64 位無(wú)符號整數。該函數不會(huì )校驗 fd 是否為eventfd()
。3.10 新版功能.
- os.eventfd_write(fd, value)?
向一個(gè)
eventfd()
文件描述符加入數據。value 必須是一個(gè) 64 位無(wú)符號整數。本函數不會(huì )校驗 fd 是否為eventfd()
。3.10 新版功能.
- os.EFD_NONBLOCK?
為新的
eventfd()
文件描述符設置O_NONBLOCK
狀態(tài)標志。3.10 新版功能.
- os.EFD_SEMAPHORE?
為讀取
eventfd()
文件描述符的操作提供類(lèi)似信號量的控制。在讀取時(shí),內部計數器遞減 1。可用性: Linux 2.6.30 以上版本,帶有 glibc 2.8 以上版本。
3.10 新版功能.
Linux 擴展屬性?
3.3 新版功能.
這些函數僅在 Linux 上可用。
- os.getxattr(path, attribute, *, follow_symlinks=True)?
返回 path 的擴展文件系統屬性 attribute 的值。attribute 可以是 bytes 或 str (直接傳入或通過(guò)
PathLike
接口間接傳入)。如果是 str,則使用文件系統編碼來(lái)編碼字符串。本函數支持 指定文件描述符為參數 和 不跟蹤符號鏈接。
引發(fā)一個(gè) 審計事件
os.getxattr
,附帶參數path
、attribute
。在 3.6 版更改: 接受一個(gè) 類(lèi)路徑對象 作為 path 和 attribute。
- os.listxattr(path=None, *, follow_symlinks=True)?
返回一個(gè)列表,包含 path 的所有擴展文件系統屬性。列表中的屬性都表示為字符串,它們是根據文件系統編碼解碼出來(lái)的。如果 path 為
None
,則listxattr()
將檢查當前目錄。本函數支持 指定文件描述符為參數 和 不跟蹤符號鏈接。
引發(fā)一個(gè) 審計事件
os.listxattr
,附帶參數path
。在 3.6 版更改: 接受一個(gè) path-like object。
- os.removexattr(path, attribute, *, follow_symlinks=True)?
移除 path 中的擴展文件系統屬性 attribute。 attribute 應為字節串或字符串類(lèi)型(通過(guò)
PathLike
接口直接或間接得到)。 若為字符串類(lèi)型,則用 filesystem encoding and error handler 進(jìn)行編碼。本函數支持 指定文件描述符為參數 和 不跟蹤符號鏈接。
引發(fā)一個(gè) 審計事件
os.removexattr
,附帶參數path
、attribute
。在 3.6 版更改: 接受一個(gè) 類(lèi)路徑對象 作為 path 和 attribute。
- os.setxattr(path, attribute, value, flags=0, *, follow_symlinks=True)?
將 path 的文件系統擴展屬性 attribute 設為 value。 attribute 必須是一個(gè)字節串或字符串,不含 NUL(通過(guò)
PathLike
接口直接或間接得到)。 若為字符串,將用 filesystem encoding and error handler 進(jìn)行編碼。 flags 可以是XATTR_REPLACE
或XATTR_CREATE
。 如果給出XATTR_REPLACE
而屬性不存在,則會(huì )觸發(fā)ENODATA
。 如果給出了XATTR_CREATE
而屬性已存在,則不會(huì )創(chuàng )建屬性并將觸發(fā)EEXISTS
。本函數支持 指定文件描述符為參數 和 不跟蹤符號鏈接。
備注
Linux kernel 2.6.39 以下版本的一個(gè) bug 導致在某些文件系統上,flags 參數會(huì )被忽略。
引發(fā)一個(gè) 審計事件
os.setxattr
,附帶參數path
、attribute
、value
、flags
。在 3.6 版更改: 接受一個(gè) 類(lèi)路徑對象 作為 path 和 attribute。
- os.XATTR_SIZE_MAX?
一條擴展屬性的值的最大大小。在當前的 Linux 上是 64 KiB。
- os.XATTR_CREATE?
這是
setxattr()
的 flags 參數的可取值,它表示該操作必須創(chuàng )建一個(gè)屬性。
- os.XATTR_REPLACE?
這是
setxattr()
的 flags 參數的可取值,它表示該操作必須替換現有屬性。
進(jìn)程管理?
下列函數可用于創(chuàng )建和管理進(jìn)程。
所有 exec*
函數都接受一個(gè)參數列表,用來(lái)給新程序加載到它的進(jìn)程中。在所有情況下,傳遞給新程序的第一個(gè)參數是程序本身的名稱(chēng),而不是用戶(hù)在命令行上輸入的參數。對于 C 程序員來(lái)說(shuō),這就是傳遞給 main()
函數的 argv[0]
。例如,os.execv('/bin/echo', ['foo', 'bar'])
只會(huì )在標準輸出上打印 bar
,而 foo
會(huì )被忽略。
- os.abort()?
發(fā)送
SIGABRT
信號到當前進(jìn)程。在 Unix 上,默認行為是生成一個(gè)核心轉儲。在 Windows 上,該進(jìn)程立即返回退出代碼3
。請注意,使用signal.signal()
可以為SIGABRT
注冊 Python 信號處理程序,而調用本函數將不會(huì )調用按前述方法注冊的程序。
- os.add_dll_directory(path)?
將路徑添加到 DLL 搜索路徑。
This search path is used when resolving dependencies for imported extension modules (the module itself is resolved through
sys.path
), and also byctypes
.要移除目錄,可以在返回的對象上調用 close(),也可以在
with
語(yǔ)句內使用本方法。參閱 Microsoft 文檔 獲取如何加載 DLL 的信息。
引發(fā)一個(gè) 審計事件
os.add_dll_directory
,附帶參數path
。可用性: Windows。
3.8 新版功能: 早期版本的 CPython 解析 DLL 時(shí)用的是當前進(jìn)程的默認行為。這會(huì )導致不一致,比如不是每次都會(huì )去搜索
PATH
和當前工作目錄,且系統函數(如AddDllDirectory
)失效。在 3.8 中,DLL 的兩種主要加載方式現在可以顯式覆蓋進(jìn)程的行為,以確保一致性。請參閱 移植說(shuō)明 了解如何更新你的庫。
- 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)?
這些函數都將執行一個(gè)新程序,以替換當前進(jìn)程。它們沒(méi)有返回值。在 Unix 上,新程序會(huì )加載到當前進(jìn)程中,且進(jìn)程號與調用者相同。過(guò)程中的錯誤會(huì )被報告為
OSError
異常。當前進(jìn)程會(huì )被立即替換。打開(kāi)的文件對象和描述符都不會(huì )刷新,因此如果這些文件上可能緩沖了數據,則應在調用
exec*
函數之前使用sys.stdout.flush()
或os.fsync()
刷新它們。exec*
函數的 "l" 和 "v" 變體不同在于命令行參數的傳遞方式。如果在編碼時(shí)固定了參數數量,則 "l" 變體可能是最方便的,各參數作為execl*()
函數的附加參數傳入即可。當參數數量可變時(shí),"v" 變體更方便,參數以列表或元組的形式作為 args 參數傳遞。在這兩種情況下,子進(jìn)程的第一個(gè)參數都應該是即將運行的命令名稱(chēng),但這不是強制性的。結尾包含 "p" 的變體(
execlp()
、execlpe()
、execvp()
和execvpe()
)將使用PATH
環(huán)境變量來(lái)查找程序 file。當環(huán)境被替換時(shí)(使用下一段討論的exec*e
變體之一),PATH
變量將來(lái)自于新環(huán)境。其他變體execl()
、execle()
、execv()
和execve()
不使用PATH
變量來(lái)查找程序,因此 path 必須包含正確的絕對或相對路徑。對于
execle()
、execlpe()
、execve()
和execvpe()
(都以 "e" 結尾),env 參數是一個(gè)映射,用于定義新進(jìn)程的環(huán)境變量(代替當前進(jìn)程的環(huán)境變量)。而函數execl()
、execlp()
、execv()
和execvp()
會(huì )將當前進(jìn)程的環(huán)境變量過(guò)繼給新進(jìn)程。某些平臺上的
execve()
可以將 path 指定為打開(kāi)的文件描述符。當前平臺可能不支持此功能,可以使用os.supports_fd
檢查它是否支持。如果不可用,則使用它會(huì )拋出NotImplementedError
異常。引發(fā)一個(gè) 審計事件
os.exec
,附帶參數path
、args
、env
。可用性: Unix, Windows。
3.3 新版功能: 新增支持將
execve()
的 path 參數指定為打開(kāi)的文件描述符。在 3.6 版更改: 接受一個(gè) path-like object。
- os._exit(n)?
以狀態(tài)碼 n 退出進(jìn)程,不會(huì )調用清理處理程序,不會(huì )刷新 stdio,等等。
以下是已定義的退出代碼,可以用于 _exit()
,盡管它們不是必需的。這些退出代碼通常用于 Python 編寫(xiě)的系統程序,例如郵件服務(wù)器的外部命令傳遞程序。
備注
其中部分退出代碼在部分 Unix 平臺上可能不可用,因為平臺間存在差異。如果底層平臺定義了這些常量,那上層也會(huì )定義。
- os.EX_OK?
Exit code that means no error occurred. May be taken from the defined value of
EXIT_SUCCESS
on some platforms. Generally has a value of zero.可用性: Unix, Windows。
- os.EX_TEMPFAIL?
退出代碼,表示發(fā)生了暫時(shí)性故障。它可能并非意味著(zhù)真正的錯誤,例如在可重試的情況下無(wú)法建立網(wǎng)絡(luò )連接。
可用性: Unix。
- os.fork()?
Fork 出一個(gè)子進(jìn)程。在子進(jìn)程中返回
0
,在父進(jìn)程中返回子進(jìn)程的進(jìn)程號。如果發(fā)生錯誤,則拋出OSError
異常。注意,當從線(xiàn)程中使用
fork()
時(shí),某些平臺(包括 FreeBSD <= 6.3 和 Cygwin)存在已知問(wèn)題。引發(fā)一個(gè) 審計事件
os.fork
,沒(méi)有附帶參數。在 3.8 版更改: 不再支持在子解釋器中調用
fork()
(將拋出RuntimeError
異常)。警告
有關(guān) SSL 模塊與 fork() 結合的應用,請參閱
ssl
。可用性: Unix。
- os.forkpty()?
Fork 出一個(gè)子進(jìn)程,使用新的偽終端作為子進(jìn)程的控制終端。返回一對
(pid, fd)
,其中 pid 在子進(jìn)程中為0
,這是父進(jìn)程中新子進(jìn)程的進(jìn)程號,而 fd 是偽終端主設備的文件描述符。對于更便于移植的方法,請使用pty
模塊。如果發(fā)生錯誤,則拋出OSError
異常。引發(fā)一個(gè) 審計事件
os.forkpty
,沒(méi)有附帶參數。在 3.8 版更改: 不再支持在子解釋器中調用
forkpty()
(將拋出RuntimeError
異常)。可用性: 某些 Unix。
- os.kill(pid, sig)?
將信號 sig 發(fā)送至進(jìn)程 pid。特定平臺上可用的信號常量定義在
signal
模塊中。Windows:
signal.CTRL_C_EVENT
和signal.CTRL_BREAK_EVENT
信號是特殊信號,只能發(fā)送給共享同一個(gè)控制臺窗口的控制臺進(jìn)程,如某些子進(jìn)程。sig 取任何其他值將導致該進(jìn)程被 TerminateProcess API 無(wú)條件終止,且退出代碼為 sig。Windows 版本的kill()
還需要傳入待結束進(jìn)程的句柄。另請參閱
signal.pthread_kill()
。引發(fā)一個(gè) 審計事件
os.kill
,附帶參數pid
、sig
。3.2 新版功能: Windows 支持。
- os.killpg(pgid, sig)?
將信號 sig 發(fā)送給進(jìn)程組 pgid。
引發(fā)一個(gè) 審計事件
os.killpg
,附帶參數pgid
、sig
。可用性: Unix。
- os.pidfd_open(pid, flags=0)?
返回一個(gè)文件描述符,它指向進(jìn)程 pid。該描述符可用于管理進(jìn)程,避免出現競爭和信號。flags 參數提供給將來(lái)擴展使用,當前沒(méi)有定義標志值。
更多詳細信息請參閱 pidfd_open(2) 手冊頁(yè)。
可用性: Linux 5.3+。
3.9 新版功能.
- os.popen(cmd, mode='r', buffering=- 1)?
Open a pipe to or from command cmd. The return value is an open file object connected to the pipe, which can be read or written depending on whether mode is
'r'
(default) or'w'
. The buffering argument have the same meaning as the corresponding argument to the built-inopen()
function. The returned file object reads or writes text strings rather than bytes.如果子進(jìn)程成功退出,則
close
方法返回None
。如果發(fā)生錯誤,則返回子進(jìn)程的返回碼。在 POSIX 系統上,如果返回碼為正,則它就是進(jìn)程返回值左移一個(gè)字節后的值。如果返回碼為負,則進(jìn)程是被信號終止的,返回碼取反后就是該信號。(例如,如果子進(jìn)程被終止,則返回值可能是- signal.SIGKILL
。)在 Windows 系統上,返回值包含子進(jìn)程的返回碼(有符號整數)。在 Unix 上,
waitstatus_to_exitcode()
可以將close
方法的返回值(即退出狀態(tài),不能是None
)轉換為退出碼。在 Windows 上,close
方法的結果直接就是退出碼(或None
)。本方法是使用
subprocess.Popen
實(shí)現的,如需更強大的方法來(lái)管理和溝通子進(jìn)程,請參閱該類(lèi)的文檔。備注
The Python UTF-8 Mode affects encodings used for cmd and pipe contents.
popen()
is a simple wrapper aroundsubprocess.Popen
. Usesubprocess.Popen
orsubprocess.run()
to control options like encodings.
- os.posix_spawn(path, argv, env, *, file_actions=None, setpgroup=None, resetids=False, setsid=False, setsigmask=(), setsigdef=(), scheduler=None)?
包裝
posix_spawn()
C 庫 API,使其可以從 Python 調用。大多數用戶(hù)應使用
subprocess.run()
代替posix_spawn()
。僅位置參數 (Positional-only arguments) path、args 和 env 與
execve()
中的類(lèi)似。path 形參是可執行文件的路徑,path 中應當包含目錄。 使用
posix_spawnp()
可傳入不帶目錄的可執行文件。file_actions 參數可以是由元組組成的序列,序列描述了對子進(jìn)程中指定文件描述符采取的操作,這些操作會(huì )在 C 庫實(shí)現的
fork()
和exec()
步驟間完成。每個(gè)元組的第一個(gè)元素必須是下面列出的三個(gè)類(lèi)型指示符之一,用于描述元組剩余的元素:- 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)
。
這些元組對應于 C 庫
posix_spawn_file_actions_addopen()
,posix_spawn_file_actions_addclose()
和posix_spawn_file_actions_adddup2()
API 調用,它們?yōu)檎{用posix_spawn()
自身做準備。setpgroup 參數將子進(jìn)程的進(jìn)程組設置為指定值。如果指定值為 0,則子進(jìn)程的進(jìn)程組 ID 將與其進(jìn)程 ID 相同。如果未設置 setpgroup 值,則子進(jìn)程將繼承父進(jìn)程的進(jìn)程組 ID。本參數對應于 C 庫
POSIX_SPAWN_SETPGROUP
標志。如果 resetids 參數為
True
,則會(huì )將子進(jìn)程的有效用戶(hù) ID 和有效組 ID 重置為父進(jìn)程的實(shí)際用戶(hù) ID 和實(shí)際組 ID。如果該參數為False
,則子進(jìn)程保留父進(jìn)程的有效用戶(hù) ID 和有效組 ID。無(wú)論哪種情況,若在可執行文件上啟用了 “設置用戶(hù) ID” 和 “設置組 ID” 權限位,它們將覆蓋有效用戶(hù) ID 和有效組 ID 的設置。本參數對應于 C 庫POSIX_SPAWN_RESETIDS
標志。如果 setsid 參數為
True
,它將為 posix_spawn 新建一個(gè)會(huì )話(huà) ID。setsid 需要POSIX_SPAWN_SETSID
或POSIX_SPAWN_SETSID_NP
標志,否則會(huì )拋出NotImplementedError
異常。setsigmask 參數將信號掩碼設置為指定的信號集合。如果未使用該參數,則子進(jìn)程將繼承父進(jìn)程的信號掩碼。本參數對應于 C 庫
POSIX_SPAWN_SETSIGMASK
標志。sigdef 參數將集合中所有信號的操作全部重置為默認。本參數對應于 C 庫
POSIX_SPAWN_SETSIGDEF
標志。scheduler 參數必須是一個(gè)元組,其中包含調度器策略(可選)以及攜帶了調度器參數的
sched_param
實(shí)例。在調度器策略所在位置為None
表示未提供該值。本參數是 C 庫POSIX_SPAWN_SETSCHEDPARAM
和POSIX_SPAWN_SETSCHEDULER
標志的組合。引發(fā)一個(gè) 審計事件
os.posix_spawn
,附帶參數path
、argv
、env
。3.8 新版功能.
可用性: Unix。
- 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()
相似,但是系統會(huì )在PATH
環(huán)境變量指定的目錄列表中搜索可執行文件 executable (與execvp(3)
相同)。引發(fā)一個(gè) 審計事件
os.posix_spawn
,附帶參數path
、argv
、env
。3.8 新版功能.
可用性: 請參閱
posix_spawn()
文檔。
- os.register_at_fork(*, before=None, after_in_parent=None, after_in_child=None)?
注冊可調用對象,在使用
os.fork()
或類(lèi)似的進(jìn)程克隆 API 派生新的子進(jìn)程時(shí),這些對象會(huì )運行。參數是可選的,且為僅關(guān)鍵字 (Keyword-only) 參數。每個(gè)參數指定一個(gè)不同的調用點(diǎn)。before 是一個(gè)函數,在 fork 子進(jìn)程前調用。
after_in_parent 是一個(gè)函數,在 fork 子進(jìn)程后從父進(jìn)程調用。
after_in_child 是一個(gè)函數,從子進(jìn)程中調用。
只有希望控制權回到 Python 解釋器時(shí),才進(jìn)行這些調用。典型的
子進(jìn)程
啟動(dòng)時(shí)不會(huì )觸發(fā)它們,因為子進(jìn)程不會(huì )重新進(jìn)入解釋器。在注冊的函數中,用于 fork 前運行的函數將按與注冊相反的順序調用。用于 fork 后(從父進(jìn)程或子進(jìn)程)運行的函數按注冊順序調用。
注意,第三方 C 代碼的
fork()
調用可能不會(huì )調用這些函數,除非它顯式調用了PyOS_BeforeFork()
、PyOS_AfterFork_Parent()
和PyOS_AfterFork_Child()
。函數注冊后無(wú)法注銷(xiāo)。
可用性: Unix。
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)?
在新進(jìn)程中執行程序 path。
(注意,
subprocess
模塊提供了更強大的工具來(lái)生成新進(jìn)程并跟蹤執行結果,使用該模塊比使用這些函數更好。尤其應當檢查 使用 subprocess 模塊替換舊函數 部分。)mode 為
P_NOWAIT
時(shí),本函數返回新進(jìn)程的進(jìn)程號。mode 為P_WAIT
時(shí),如果進(jìn)程正常退出,返回退出代碼,如果被終止,返回-signal
,其中 signal 是終止進(jìn)程的信號。在 Windows 上,進(jìn)程號實(shí)際上是進(jìn)程句柄,因此可以與waitpid()
函數一起使用。注意在 VxWorks 上,新進(jìn)程被終止時(shí),本函數不會(huì )返回
-signal
,而是會(huì )拋出 OSError 異常。spawn*
函數的 "l" 和 "v" 變體不同在于命令行參數的傳遞方式。如果在編碼時(shí)固定了參數數量,則 "l" 變體可能是最方便的,各參數作為spawnl*()
函數的附加參數傳入即可。當參數數量可變時(shí),"v" 變體更方便,參數以列表或元組的形式作為 args 參數傳遞。在這兩種情況下,子進(jìn)程的第一個(gè)參數都必須是即將運行的命令名稱(chēng)。結尾包含第二個(gè) "p" 的變體(
spawnlp()
、spawnlpe()
、spawnvp()
和spawnvpe()
)將使用PATH
環(huán)境變量來(lái)查找程序 file。當環(huán)境被替換時(shí)(使用下一段討論的spawn*e
變體之一),PATH
變量將來(lái)自于新環(huán)境。其他變體spawnl()
、spawnle()
、spawnv()
和spawnve()
不使用PATH
變量來(lái)查找程序,因此 path 必須包含正確的絕對或相對路徑。對于
spawnle()
、spawnlpe()
、spawnve()
和spawnvpe()
(都以 "e" 結尾),env 參數是一個(gè)映射,用于定義新進(jìn)程的環(huán)境變量(代替當前進(jìn)程的環(huán)境變量)。而函數spawnl()
、spawnlp()
、spawnv()
和spawnvp()
會(huì )將當前進(jìn)程的環(huán)境變量過(guò)繼給新進(jìn)程。注意,env 字典中的鍵和值必須是字符串。無(wú)效的鍵或值將導致函數出錯,返回值為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)
引發(fā)一個(gè) 審計事件
os.spawn
,附帶參數mode
、path
、args
、env
。可用性: Unix, Windows。
spawnlp()
、spawnlpe()
、spawnvp()
和spawnvpe()
在 Windows 上不可用。spawnle()
和spawnve()
在 Windows 上不是線(xiàn)程安全的,建議使用subprocess
模塊替代。在 3.6 版更改: 接受一個(gè) path-like object。
- os.P_NOWAIT?
- os.P_NOWAITO?
spawn*
系列函數的 mode 參數的可取值。如果給出這些值中的任何一個(gè),則spawn*()
函數將在創(chuàng )建新進(jìn)程后立即返回,且返回值為進(jìn)程號。可用性: Unix, Windows。
- os.P_WAIT?
spawn*
系列函數的 mode 參數的可取值。如果將 mode 指定為該值,則spawn*()
函數將在新進(jìn)程運行完畢后返回,運行成功則返回進(jìn)程的退出代碼,被信號終止則返回-signal
。可用性: Unix, Windows。
- os.P_DETACH?
- os.P_OVERLAY?
spawn*
系列函數的 mode 參數的可取值。它們比上面列出的值可移植性差。P_DETACH
與P_NOWAIT
相似,但是新進(jìn)程會(huì )與父進(jìn)程的控制臺脫離。使用P_OVERLAY
則會(huì )替換當前進(jìn)程,spawn*
函數將不會(huì )返回。可用性: Windows。
- os.startfile(path[, operation][, arguments][, cwd][, show_cmd])?
使用已關(guān)聯(lián)的應用程序打開(kāi)文件。
當 operation 未指定或指定為
'open'
時(shí),這類(lèi)似于在 Windows 資源管理器中雙擊文件,或在交互式命令行中將文件名作為 start 命令的參數:通過(guò)擴展名相關(guān)聯(lián)的應用程序(如果有)打開(kāi)文件。當指定另一個(gè) operation 時(shí),它必須是一個(gè)“命令動(dòng)詞” ("command verb"),該詞指定對文件執行的操作。Microsoft 文檔中的常用動(dòng)詞有
'print'
和'edit'
(用于文件),以及'explore'
和'find'
(用于目錄)。在啟動(dòng)某個(gè)應用程序時(shí),arguments 將作為一個(gè)字符串傳入。若是打開(kāi)某個(gè)文檔,此參數可能沒(méi)什么效果。
默認工作目錄是繼承而來(lái)的,但可以通過(guò) cwd 參數進(jìn)行覆蓋。且應為絕對路徑。相對路徑 path 將據此參數進(jìn)行解析。
show_cmd 可用于覆蓋默認的窗口樣式。是否生效則取決于被啟動(dòng)的應用程序。應為 Win32 函數
ShellExecute()
所支持的整數值。在關(guān)聯(lián)的應用程序啟動(dòng)后,
startfile()
就會(huì )立即返回。 沒(méi)有提供等待應用程序關(guān)閉的選項,也沒(méi)有辦法獲得應用程序的退出狀態(tài)。 path 形參是基于當前目錄或 cwd 的相對路徑。 如果要使用絕對路徑,請確保第一個(gè)字符不為斜杠 ('/'
) 。 請用pathlib
或os.path.normpath()
函數來(lái)保證路徑已按照 Win32 的要求進(jìn)行了正確的編碼。為了減少解釋器的啟動(dòng)開(kāi)銷(xiāo),直到第一次調用本函數后,才解析 Win32
ShellExecute()
函數。如果無(wú)法解析該函數??,則拋出NotImplementedError
異常。引發(fā)一個(gè) 審計事件
os.startfile
,附帶參數path
、operation
。引發(fā)一條 審計事件
os.startfile/2
,附帶參數為path
、operation
、arguments
、cwd
、show_cmd
。可用性: Windows。
在 3.10 版更改: 加入了 arguments、cwd 和 show_cmd 參數,以及
os.startfile/2
審計事件。
- os.system(command)?
在子外殼程序中執行此命令(一個(gè)字符串)。 這是通過(guò)調用標準 C 函數
system()
來(lái)實(shí)現的,并受到同樣的限制。 對sys.stdin
的更改等不會(huì )反映在所執行命令的環(huán)境中。 如果 command 生成了任何輸出,它將被發(fā)送到解釋器的標準輸出流。 C 標準沒(méi)有指明這個(gè) C 函數返回值的含義,因此這個(gè) Python 函數的返回值取決于具體系統。在 Unix 上,返回值為進(jìn)程的退出狀態(tài),以針對
wait()
而指定的格式進(jìn)行編碼。在 Windows 上,返回值是運行 command 后系統 Shell 返回的值。該 Shell 由 Windows 環(huán)境變量
COMSPEC
: 給出:通常是 cmd.exe,它會(huì )返回命令的退出狀態(tài)。在使用非原生 Shell 的系統上,請查閱 Shell 的文檔。subprocess
模塊提供了更強大的工具來(lái)生成新進(jìn)程并跟蹤執行結果,使用該模塊比使用本函數更好。參閱subprocess
文檔中的 使用 subprocess 模塊替換舊函數 部分以獲取有用的幫助。在 Unix 上,
waitstatus_to_exitcode()
可以將返回值(即退出狀態(tài))轉換為退出碼。在 Windows 上,返回值就是退出碼。引發(fā)一個(gè) 審計事件
os.system
,附帶參數command
。可用性: Unix, Windows。
- os.times()?
返回當前的全局進(jìn)程時(shí)間。返回值是一個(gè)有 5 個(gè)屬性的對象:
user
- user timesystem
- system timechildren_user
- user time of all child processeschildren_system
- system time of all child processeselapsed
- elapsed real time since a fixed point in the past
For backwards compatibility, this object also behaves like a five-tuple containing
user
,system
,children_user
,children_system
, andelapsed
in that order.See the Unix manual page times(2) and times(3) manual page on Unix or the GetProcessTimes MSDN on Windows. On Windows, only
user
andsystem
are known; the other attributes are zero.可用性: Unix, Windows。
在 3.3 版更改: 返回結果的類(lèi)型由元組變成一個(gè)類(lèi)似元組的對象,同時(shí)具有命名的屬性。
- os.wait()?
等待子進(jìn)程執行完畢,返回一個(gè)元組,包含其 pid 和退出狀態(tài)指示:一個(gè) 16 位數字,其低字節是終止該進(jìn)程的信號編號,高字節是退出狀態(tài)碼(信號編號為零的情況下),如果生成了核心文件,則低字節的高位會(huì )置位。
可以使用
waitstatus_to_exitcode()
來(lái)將退出狀態(tài)轉換為退出碼。可用性: Unix。
參見(jiàn)
waitpid()
可以等待特定的子進(jìn)程執行完畢,且支持更多選項。
- os.waitid(idtype, id, options)?
等待一個(gè)或多個(gè)子進(jìn)程執行完畢。idtype 可以是
P_PID
,P_PGID
,P_ALL
, 或P_PIDFD
(Linux 可用)。id 指定要等待的 pid。options 是由WEXITED
、WSTOPPED
或WCONTINUED
中的一個(gè)或多個(gè)進(jìn)行或運算構造的,且額外可以與WNOHANG
或WNOWAIT
進(jìn)行或運算。返回值是一個(gè)對象,對應著(zhù)siginfo_t
結構體中的數據,即:si_pid
,si_uid
,si_signo
,si_status
,si_code
或None
(如果指定了WNOHANG
且沒(méi)有子進(jìn)程處于等待狀態(tài))。可用性: Unix。
3.3 新版功能.
- os.WEXITED?
- os.WSTOPPED?
- os.WNOWAIT?
用于
waitid()
的 options 參數的標志位,指定要等待的子進(jìn)程信號。可用性: Unix。
3.3 新版功能.
- os.CLD_EXITED?
- os.CLD_KILLED?
- os.CLD_DUMPED?
- os.CLD_TRAPPED?
- os.CLD_STOPPED?
- os.CLD_CONTINUED?
waitid()
返回的結果中,si_code
的可取值。可用性: Unix。
3.3 新版功能.
在 3.9 版更改: 添加了
CLD_KILLED
和CLD_STOPPED
值。
- os.waitpid(pid, options)?
本函數的細節在 Unix 和 Windows 上有不同之處。
在 Unix 上:等待進(jìn)程號為 pid 的子進(jìn)程執行完畢,返回一個(gè)元組,內含其進(jìn)程 ID 和退出狀態(tài)指示(編碼與
wait()
相同)。調用的語(yǔ)義受整數 options 的影響,常規操作下該值應為0
。如果 pid 大于
0
,則waitpid()
會(huì )獲取該指定進(jìn)程的狀態(tài)信息。如果 pid 為0
,則獲取當前進(jìn)程所在進(jìn)程組中的所有子進(jìn)程的狀態(tài)。如果 pid 為-1
,則獲取當前進(jìn)程的子進(jìn)程狀態(tài)。如果 pid 小于-1
,則獲取進(jìn)程組-pid
( pid 的絕對值)中所有進(jìn)程的狀態(tài)。當系統調用返回 -1 時(shí),將拋出帶有錯誤碼的
OSError
異常。在 Windows 上:等待句柄為 pid 的進(jìn)程執行完畢,返回一個(gè)元組,內含 pid 以及左移 8 位后的退出狀態(tài)碼(移位簡(jiǎn)化了跨平臺使用本函數)。小于或等于
0
的 pid 在 Windows 上沒(méi)有特殊含義,且會(huì )拋出異常。整數值 options 無(wú)效。pid 可以指向任何 ID 已知的進(jìn)程,不一定是子進(jìn)程。調用spawn*
函數時(shí)傳入P_NOWAIT
將返回合適的進(jìn)程句柄。可以使用
waitstatus_to_exitcode()
來(lái)將退出狀態(tài)轉換為退出碼。在 3.5 版更改: 如果系統調用被中斷,但信號處理程序沒(méi)有觸發(fā)異常,此函數現在會(huì )重試系統調用,而不是觸發(fā)
InterruptedError
異常 (原因詳見(jiàn) PEP 475)。
- os.wait3(options)?
與
waitpid()
相似,差別在于沒(méi)有進(jìn)程 ID 參數,且返回一個(gè) 3 元組,其中包括子進(jìn)程 ID,退出狀態(tài)指示和資源使用信息。關(guān)于資源使用信息的詳情,請參考resource
.getrusage()
。option 參數與傳入waitpid()
和wait4()
的相同。可以使用
waitstatus_to_exitcode()
來(lái)將退出狀態(tài)轉換為退出碼。可用性: Unix。
- os.wait4(pid, options)?
與
waitpid()
相似,差別在本方法返回一個(gè) 3 元組,其中包括子進(jìn)程 ID,退出狀態(tài)指示和資源使用信息。關(guān)于資源使用信息的詳情,請參考resource
.getrusage()
。wait4()
的參數與waitpid()
的參數相同。可以使用
waitstatus_to_exitcode()
來(lái)將退出狀態(tài)轉換為退出碼。可用性: Unix。
- os.waitstatus_to_exitcode(status)?
將等待狀態(tài)轉換為退出碼。
在 Unix 上:
如果進(jìn)程正常退出(當
WIFEXITED(status)
為真值),則返回進(jìn)程退出狀態(tài) (返回WEXITSTATUS(status)
): 結果值大于等于 0。如果進(jìn)程被信號終止(當
WIFSIGNALED(status)
為真值),則返回-signum
其中 signum 為導致進(jìn)程終止的信號數值 (返回-WTERMSIG(status)
): 結果值小于 0。否則將拋出
ValueError
異常。
在 Windows 上,返回 status 右移 8 位的結果。
在 Unix 上,如果進(jìn)程正被追蹤或
waitpid()
附帶WUNTRACED
選項被調用,則調用者必須先檢查WIFSTOPPED(status)
是否為真值。 如果WIFSTOPPED(status)
為真值則此函數不可被調用。參見(jiàn)
WIFEXITED()
,WEXITSTATUS()
,WIFSIGNALED()
,WTERMSIG()
,WIFSTOPPED()
,WSTOPSIG()
函數。3.9 新版功能.
- os.WCONTINUED?
被任務(wù)控制 (job control) 停止的子進(jìn)程,如果上次報告狀態(tài)后已恢復運行,則此選項將報告這些子進(jìn)程。
可用性: 部分 Unix 系統。
下列函數采用進(jìn)程狀態(tài)碼作為參數,狀態(tài)碼由 system()
、wait()
或 waitpid()
返回。它們可用于確定進(jìn)程上發(fā)生的操作。
- os.WCOREDUMP(status)?
如果為該進(jìn)程生成了核心轉儲,返回
True
,否則返回False
。此函數應當僅在
WIFSIGNALED()
為真值時(shí)使用。可用性: Unix。
- os.WIFCONTINUED(status)?
如果一個(gè)已停止的子進(jìn)程通過(guò)傳送
SIGCONT
獲得恢復(如果該進(jìn)程是從任務(wù)控制停止后再繼續的)則返回True
,否則返回False
。參見(jiàn)
WCONTINUED
選項。可用性: Unix。
- os.WIFSTOPPED(status)?
如果進(jìn)程是通過(guò)傳送一個(gè)信號來(lái)停止的則返回
True
,否則返回False
。WIFSTOPPED()
只有在當waitpid()
調用是通過(guò)使用WUNTRACED
選項來(lái)完成或者當該進(jìn)程正被追蹤時(shí) (參見(jiàn) ptrace(2)) 才返回True
。可用性: Unix。
- os.WIFEXITED(status)?
如果進(jìn)程正常終止退出則返回
True
,也就是說(shuō)通過(guò)調用exit()
或_exit()
,或者通過(guò)從main()
返回;在其他情況下則返回False
。可用性: Unix。
- os.WEXITSTATUS(status)?
返回進(jìn)程退出狀態(tài)。
此函數應當僅在
WIFEXITED()
為真值時(shí)使用。可用性: Unix。
- os.WSTOPSIG(status)?
返回導致進(jìn)程停止的信號。
此函數應當僅在
WIFSTOPPED()
為真值時(shí)使用。可用性: Unix。
- os.WTERMSIG(status)?
返回導致進(jìn)程終止的信號的編號。
此函數應當僅在
WIFSIGNALED()
為真值時(shí)使用。可用性: Unix。
調度器接口?
這些函數控制操作系統如何為進(jìn)程分配 CPU 時(shí)間。 它們僅在某些 Unix 平臺上可用。 更多細節信息請查閱你所用 Unix 的指南頁(yè)面。
3.3 新版功能.
以下調度策略如果被操作系統支持就會(huì )對外公開(kāi)。
- os.SCHED_OTHER?
默認調度策略。
- os.SCHED_BATCH?
用于 CPU 密集型進(jìn)程的調度策略,它會(huì )盡量為計算機中的其余任務(wù)保留交互性。
- os.SCHED_IDLE?
用于極低優(yōu)先級的后臺任務(wù)的調度策略。
- os.SCHED_SPORADIC?
用于偶發(fā)型服務(wù)程序的調度策略。
- os.SCHED_FIFO?
先進(jìn)先出的調度策略。
- os.SCHED_RR?
循環(huán)式的調度策略。
- os.SCHED_RESET_ON_FORK?
此旗標可與任何其他調度策略進(jìn)行 OR 運算。 當帶有此旗標的進(jìn)程設置分叉時(shí),其子進(jìn)程的調度策略和優(yōu)先級會(huì )被重置為默認值。
- class os.sched_param(sched_priority)?
這個(gè)類(lèi)表示在
sched_setparam()
,sched_setscheduler()
和sched_getparam()
中使用的可修改調度形參。 它屬于不可變對象。目前它只有一個(gè)可能的形參:
- sched_priority?
一個(gè)調度策略的調度優(yōu)先級。
- os.sched_get_priority_min(policy)?
獲取 policy 的最低優(yōu)先級數值。 policy 是以上調度策略常量之一。
- os.sched_get_priority_max(policy)?
獲取 policy 的最高優(yōu)先級數值。 policy 是以上調度策略常量之一。
- os.sched_setscheduler(pid, policy, param)?
設置 PID 為 pid 的進(jìn)程的調度策略。pid 為 0 指的是調用本方法的進(jìn)程。policy 是以上調度策略常量之一。param 是一個(gè)
sched_param
實(shí)例。
- os.sched_getscheduler(pid)?
返回 PID 為 pid 的進(jìn)程的調度策略。pid 為 0 指的是調用本方法的進(jìn)程。返回的結果是以上調度策略常量之一。
- os.sched_setparam(pid, param)?
設置 PID 為 pid 的進(jìn)程的調度參數。 pid 為 0 表示調用方過(guò)程。 param 是一個(gè)
sched_param
實(shí)例。
- os.sched_getparam(pid)?
返回 PID 為 pid 的進(jìn)程的調度參數為一個(gè)
sched_param
實(shí)例。pid 為 0 指的是調用本方法的進(jìn)程。
- os.sched_rr_get_interval(pid)?
返回 PID 為 pid 的進(jìn)程在時(shí)間片輪轉調度下的時(shí)間片長(cháng)度(單位為秒)。pid 為 0 指的是調用本方法的進(jìn)程。
- os.sched_yield()?
自愿放棄 CPU。
- os.sched_setaffinity(pid, mask)?
將 PID 為 pid 的進(jìn)程(為零則為當前進(jìn)程)限制到一組 CPU 上。mask 是整數的可迭代對象,表示應將進(jìn)程限制在其中的一組 CPU。
- os.sched_getaffinity(pid)?
返回 PID 為 pid 的進(jìn)程(為零則為當前進(jìn)程)被限制到的那一組 CPU。
其他系統信息?
- os.confstr(name)?
返回字符串格式的系統配置信息。name 指定要查找的配置名稱(chēng),它可以是字符串,是一個(gè)系統已定義的名稱(chēng),這些名稱(chēng)定義在不同標準(POSIX,Unix 95,Unix 98 等)中。一些平臺還定義了額外的其他名稱(chēng)。當前操作系統已定義的名稱(chēng)在
confstr_names
字典的鍵中給出。對于未包含在該映射中的配置名稱(chēng),也可以傳遞一個(gè)整數作為 name。如果 name 指定的配置值未定義,返回
None
。如果 name 是一個(gè)字符串且不是已定義的名稱(chēng),將拋出
ValueError
異常。如果當前系統不支持 name 指定的配置名稱(chēng),即使該名稱(chēng)存在于confstr_names
,也會(huì )拋出OSError
異常,錯誤碼為errno.EINVAL
。可用性: Unix。
- os.confstr_names?
字典,表示映射關(guān)系,為
confstr()
可接受名稱(chēng)與操作系統為這些名稱(chēng)定義的整數值之間的映射。這可用于判斷系統已定義了哪些名稱(chēng)。可用性: Unix。
- os.cpu_count()?
返回系統的 CPU 數量。不確定則返回
None
。該數量不同于當前進(jìn)程可以使用的CPU數量??捎玫腃PU數量可以由
len(os.sched_getaffinity(0))
方法獲得。3.4 新版功能.
- os.sysconf(name)?
返回整數格式的系統配置信息。如果 name 指定的配置值未定義,返回
-1
。對confstr()
的 name 參數的注釋在此處也適用。當前已知的配置名稱(chēng)在sysconf_names
字典中提供。可用性: Unix。
- os.sysconf_names?
字典,表示映射關(guān)系,為
sysconf()
可接受名稱(chēng)與操作系統為這些名稱(chēng)定義的整數值之間的映射。這可用于判斷系統已定義了哪些名稱(chēng)。可用性: Unix。
在 3.11 版更改: Add
'SC_MINSIGSTKSZ'
name.
以下數據值用于支持對路徑本身的操作。所有平臺都有定義。
對路徑的高級操作在 os.path
模塊中定義。
- os.sep?
操作系統用來(lái)分隔路徑不同部分的字符。在 POSIX 上是
'/'
,在 Windows 上是是'\\'
。注意,僅了解它不足以能解析或連接路徑,請使用os.path.split()
和os.path.join()
,但它有時(shí)是有用的。在os.path
中也可用。
- os.altsep?
操作系統用來(lái)分隔路徑不同部分的替代字符。如果僅存在一個(gè)分隔符,則為
None
。在sep
是反斜杠的 Windows 系統上,該值被設為'/'
。在os.path
中也可用。
- os.linesep?
當前平臺用于分隔(或終止)行的字符串。它可以是單個(gè)字符,如 POSIX 上是
'\n'
,也可以是多個(gè)字符,如 Windows 上是'\r\n'
。在寫(xiě)入以文本模式(默認模式)打開(kāi)的文件時(shí),請不要使用 os.linesep 作為行終止符,請在所有平臺上都使用一個(gè)'\n'
代替。
- os.RTLD_LAZY?
- os.RTLD_NOW?
- os.RTLD_GLOBAL?
- os.RTLD_LOCAL?
- os.RTLD_NODELETE?
- os.RTLD_NOLOAD?
- os.RTLD_DEEPBIND?
setdlopenflags()
和getdlopenflags()
函數所使用的標志。請參閱 Unix 手冊頁(yè) dlopen(3) 獲取不同標志的含義。3.3 新版功能.
隨機數?
- os.getrandom(size, flags=0)?
獲得最多為 size 的隨機字節。本函數返回的字節數可能少于請求的字節數。
這些字節可用于為用戶(hù)空間的隨機數生成器提供種子,或用于加密目的。
getrandom()
依賴(lài)于從設備驅動(dòng)程序和其他環(huán)境噪聲源收集的熵。不必要地讀取大量數據將對使用/dev/random
和/dev/urandom
設備的其他用戶(hù)產(chǎn)生負面影響。flags 參數是一個(gè)位掩碼,可以是零個(gè)或多個(gè)下列值以或運算組合:
os.GRND_RANDOM
和GRND_NONBLOCK
。另請參閱 Linux getrandom() 手冊頁(yè) 。
可用性:Linux 3.17 或更高版本。
3.6 新版功能.
- os.urandom(size)?
Return a bytestring of size random bytes suitable for cryptographic use.
本函數從系統指定的隨機源獲取隨機字節。對于加密應用程序,返回的數據應有足夠的不可預測性,盡管其確切的品質(zhì)取決于操作系統的實(shí)現。
在 Linux 上,如果
getrandom()
系統調用可用,它將以阻塞模式使用:阻塞直到系統的 urandom 熵池初始化完畢(內核收集了 128 位熵)。原理請參閱 PEP 524。在 Linux 上,getrandom()
可以以非阻塞模式(使用GRND_NONBLOCK
標志)獲取隨機字節,或者輪詢(xún)直到系統的 urandom 熵池初始化完畢。在類(lèi) Unix 系統上,隨機字節是從
/dev/urandom
設備讀取的。如果/dev/urandom
設備不可用或不可讀,則拋出NotImplementedError
異常。On Windows, it will use
BCryptGenRandom()
.參見(jiàn)
secrets
模塊提供了更高級的功能。所在平臺會(huì )提供隨機數生成器,有關(guān)其易于使用的接口,請參閱random.SystemRandom
。在 3.6.0 版更改: 在 Linux 上,
getrandom()
現在以阻塞模式使用,以提高安全性。在 3.5.2 版更改: 在 Linux 上,如果
getrandom()
系統調用阻塞(urandom 熵池尚未初始化完畢),則退回一步讀取/dev/urandom
。在 3.5 版更改: 在 Linux 3.17 和更高版本上,現在使用
getrandom()
系統調用(如果可用)。在 OpenBSD 5.6 和更高版本上,現在使用getentropy()
C 函數。這些函數避免了使用內部文件描述符。在 3.11 版更改: On Windows,
BCryptGenRandom()
is used instead ofCryptGenRandom()
which is deprecated.
- os.GRND_NONBLOCK?
默認情況下,從
/dev/random
讀取時(shí),如果沒(méi)有可用的隨機字節,則getrandom()
會(huì )阻塞;從/dev/urandom
讀取時(shí),如果熵池尚未初始化,則會(huì )阻塞。如果設置了
GRND_NONBLOCK
標志,則這些情況下getrandom()
不會(huì )阻塞,而是立即拋出BlockingIOError
異常。3.6 新版功能.
- os.GRND_RANDOM?
如果設置了此標志位,那么將從
/dev/random
池而不是/dev/urandom
池中提取隨機字節。3.6 新版功能.