os
– 基本的“操作系统”服务¶
该模块实现了相应 CPython 模块的 一个子集,如下所述。有关更多信息,请参阅原始 CPython 文档: os
.
该os
模块包含用于文件系统访问和挂载、终端重定向和复制以及uname
和urandom
函数的函数。
一般功能¶
-
os.
uname
()¶ 返回包含有关底层机器和/或其操作系统的信息的元组(可能是命名元组)。元组有五个字段,按以下顺序排列,每个字段都是一个字符串:
sysname
– 底层系统的名称nodename
–网络名称(可以与 相同sysname
)release
– 底层系统的版本version
– MicroPython 版本和构建日期machine
– 底层硬件的标识符(例如板、CPU)
-
os.
urandom
(n)¶ 返回一个带有n 个随机字节的字节对象。只要有可能,它就由硬件随机数生成器生成。
文件系统访问¶
-
os.
chdir
(path)¶ 更改当前目录。
-
os.
getcwd
()¶ 获取当前目录。
-
os.
ilistdir
([dir])¶ 这个函数返回一个迭代器,然后它产生与它列出的目录中的条目相对应的元组。不带参数列出当前目录,否则列出dir给出的目录。
元组的形式为(name, type, inode[, size]):
name是一个字符串(如果dir是一个字节对象,则为字节)并且是条目的名称;
type是一个整数,指定条目的类型,0x4000 表示目录,0x8000 表示常规文件;
inode是与文件的 inode 对应的整数,对于没有这种概念的文件系统,可能为 0。
某些平台可能会返回一个 4 元组,其中包括条目的size。对于文件条目,大小是表示文件大小的整数,如果未知,则为 -1。对于目录条目,其含义当前未定义。
-
os.
listdir
([dir])¶ 不带参数,列出当前目录。否则列出给定的目录。
-
os.
mkdir
(path)¶ 创建一个新目录。
-
os.
remove
(path)¶ 删除文件。
-
os.
rmdir
(path)¶ 删除目录。
-
os.
rename
(old_path, new_path)¶ 重命名文件。
-
os.
stat
(path)¶ 获取文件或目录的状态。
-
os.
statvfs
(path)¶ 获取文件系统的状态。
按以下顺序返回包含文件系统信息的元组:
f_bsize
– 文件系统块大小f_frsize
– 片段大小f_blocks
– 以 f_frsize 为单位的 fs 大小f_bfree
– 空闲块数f_bavail
– 非特权用户的空闲块数f_files
– inode 的数量f_ffree
– 空闲 inode 的数量f_favail
– 非特权用户的免费 inode 数量f_flag
– 挂载标志f_namemax
– 最大文件名长度
相关信息节点参数:
f_files
,f_ffree
,f_avail
和f_flags
参数可能会返回0
,因为他们可以在一个端口的具体实施不可用。
-
os.
sync
()¶ 同步所有文件系统。
终端重定向和复制¶
-
os.
dupterm
(stream_object, index=0, /)¶ 在给定的类似
stream
对象上复制或切换 MicroPython 终端(REPL)。所述stream_object参数必须是一个本地流对象,或从导出io.IOBase
并实施readinto()
和write()
方法。流应该处于非阻塞模式,如果没有可供读取的数据,readinto()
应该返回None
。调用此函数后,所有终端输出都会在此流上重复,并且流上可用的任何输入都将传递到终端输入。
所述索引参数应该是哪个复制时隙设置一个非负整数,并且指定。一个给定的端口可以实现多个插槽(插槽 0 将始终可用),在这种情况下,终端输入和输出在所有设置的插槽上都是重复的。
如果
None
作为stream_object传递,则在index给定的插槽上取消重复。该函数返回给定槽中的前一个类流对象。
文件系统挂载¶
一些端口提供了一个虚拟文件系统 (VFS) 和在这个 VFS 中挂载多个“真实”文件系统的能力。文件系统对象可以挂载在 VFS 的根目录中,也可以挂载在根目录中的子目录中。这允许对 Python 程序可见的文件系统进行动态和灵活的配置。具有此功能的端口提供mount()
和
umount()
功能,以及可能由 VFS 类表示的各种文件系统实现。
-
os.
mount
(fsobj, mount_point, *, readonly)¶ 将文件系统对象fsobj挂载到mount_point字符串给定的 VFS 中的位置 。 fsobj可以是具有
mount()
方法或块设备的VFS 对象。如果它是块设备,则自动检测文件系统类型(如果没有识别出文件系统,则会引发异常)。 mount_point可能是'/'
将fsobj挂载在根目录,也可能是挂载在根'/<name>'
目录下的子目录。如果只读,
True
则文件系统以只读方式挂载。在挂载过程中,该方法
mount()
在文件系统对象上被调用。OSError(EPERM)
如果mount_point已经安装,则会引发。
-
os.
umount
(mount_point)¶ 卸载文件系统。mount_point可以是命名挂载位置的字符串,也可以是先前挂载的文件系统对象。在卸载过程中,该方法
umount()
在文件系统对象上被调用。OSError(EINVAL)
如果未找到mount_point将引发。
-
class
os.
VfsFat
(block_dev)¶ 创建一个使用 FAT 文件系统格式的文件系统对象。FAT 文件系统的存储由block_dev提供。由该构造函数创建的对象可以使用
mount()
.-
static
mkfs
(block_dev)¶ 在block_dev上构建 FAT 文件系统。
-
static
-
class
os.
VfsLfs1
(block_dev, readsize=32, progsize=32, lookahead=32)¶ 创建一个使用littlefs v1 文件系统格式的文件系统对象。littlefs 文件系统的存储由block_dev提供,它必须支持扩展接口。由该构造函数创建的对象可以使用
mount()
.有关更多信息,请参阅使用文件系统。
-
static
mkfs
(block_dev, readsize=32, progsize=32, lookahead=32)¶ 建立在Lfs1文件系统block_dev。
笔记
有报告称 littlefs v1 在某些情况下会失败,有关详细信息,请参阅littlefs issue 347.
-
static
-
class
os.
VfsLfs2
(block_dev, readsize=32, progsize=32, lookahead=32, mtime=True)¶ 创建一个使用 littlefs v2 文件系统格式. 的文件系统对象。littlefs 文件系统的存储由block_dev提供,它必须支持扩展接口。由该构造函数创建的对象可以使用
mount()
.该修改时间参数使修改时间戳文件,使用littlefs属性存储。此选项可以在每个挂载时间以不同的方式禁用或启用,并且只有在启用mtime时才会添加或更新时间戳,否则时间戳将保持不变。没有时间戳的 Littlefs v2 文件系统无需重新格式化即可工作,一旦打开以进行写入,时间戳将透明地添加到现有文件中。在没有时间戳的文件 上启用mtime 时
os.stat
,时间戳将返回 0。有关更多信息,请参阅使用文件系统。
-
static
mkfs
(block_dev, readsize=32, progsize=32, lookahead=32)¶ 建立在Lfs2文件系统block_dev。
笔记
有报告称 littlefs v2 在某些情况下会失败,有关详细信息,请参阅 littlefs 问题 295。
-
static
块设备¶
块设备是实现块协议的对象。这使设备能够支持 MicroPython 文件系统。物理硬件由用户定义的类表示。所述AbstractBlockDev
类是这样的类的设计的模板:MicroPython实际上并不提供类,但实际的块设备类必须实现的方法描述如下。
此类的具体实现通常允许访问一块硬件(如闪存)的类似内存的功能。块设备可以格式化为任何支持的文件系统并使用 os
方法挂载。
有关使用下面描述的块协议的两个变体的块设备的示例实现,请参阅使用文件系统 。
简单和扩展的界面¶
readblocks
和 writeblocks
方法有两个兼容的签名(见下文),以支持各种用例。给定的块设备可以实现一种形式或另一种形式,或同时实现两种形式。第二种形式(带有偏移参数)被称为“扩展接口”。
一些需要对写入操作进行更多控制的文件系统(例如 littlefs),例如在不擦除的情况下写入子块区域,可能需要块设备支持扩展接口。
-
class
os.
AbstractBlockDev
(...)¶ 构造块设备对象。构造函数的参数取决于特定的块设备。
-
readblocks
(block_num, buf)¶ -
readblocks
(block_num, buf, offset) 第一种形式读取对齐的块的倍数。从索引block_num给出的块开始,将设备中的块读入buf(字节数组)。要读取的块数由buf的长度给出,它将是块大小的倍数。
第二种形式允许在块内的任意位置和任意长度读取。从块索引block_num和 offset 块内的字节偏移量开始,从设备读取字节到buf(字节数组)。要读取的字节数由buf的长度给出。
-
writeblocks
(block_num, buf)¶ -
writeblocks
(block_num, buf, offset) 第一种形式写入对齐的多个块,并要求通过此方法首先擦除写入的块(如果需要)。从索引block_num给出的块开始,将块从 buf(字节数组)写入设备。要写入的块数由buf的长度给出,它将是块大小的倍数。
第二种形式允许在块内的任意位置和任意长度写入。只应更改正在写入的字节,并且此方法的调用者必须确保通过先前的
ioctl
调用已擦除相关块。从块索引block_num和偏移块内的字节偏移量开始,将字节从buf(字节数组)写入设备。要写入的字节数由buf的长度给出。请注意,如果指定了 offset 参数,则实现绝不能隐式擦除块,即使它为零。
-
ioctl
(op, arg)¶ 控制块设备并查询其参数。要执行的操作由op给出,它是以下整数之一:
1 – 初始化设备(arg未使用)
2 – 关闭设备(arg未使用)
3 – 同步设备(arg未使用)
4 – 获取块数的计数,应返回一个整数(arg未使用)
5 – 获取块中的字节数,应该返回一个整数,或者
None
在这种情况下使用默认值 512 (arg未使用)6 – e在这种情况下使用默认值 512 (arg未使用)
至少必须被拦截;因为 littlefs 也必须被拦截。对其他人的需求取决于硬件。
ioctl(4, ...)
must be intercepted; for littlefsioctl(6, ...)
在对littlefs 问题 进行任何调用之前。如果硬件需要,这使得设备驱动程序能够在写入之前擦除块。或者,驱动程序可能会拦截并返回 0(成功)。在这种情况下,驱动程序负责检测是否需要擦除。
writeblocks(block, ...)
ioctl(6, block)
.ioctl(6, block)
除非另有说明可以退货。因此,实现可以忽略 的未使用值。在哪里 截取,操作4和5的返回值如上详述。其他操作应该在成功时返回 0,失败时返回非零,返回的值是一个errno 代码。
ioctl(op, arg)
None
.op
op
OSError
-