uos – 基本的“操作系统”服务

该模块实现了相应 CPython模块的 一个子集,如下所述。有关更多信息,请参阅原始 CPython 文档:os.

uos 模块包含用于文件系统访问和挂载、终端重定向和复制以及unameurandom 函数的函数。

一般功能

uos.uname()

返回包含有关底层机器和/或其操作系统的信息的元组(可能是命名元组)。元组有五个字段,按以下顺序排列,每个字段都是一个字符串:

  • sysname – 底层系统的名称

  • nodename –网络名称(可以与 相同sysname)

  • release – 底层系统的版本

  • version – MicroPython 版本和构建日期

  • machine – 底层硬件的标识符(例如板、CPU)

uos.urandom(n)

返回一个带有n 个随机字节的字节对象。只要有可能,它就由硬件随机数生成器生成。

文件系统访问

uos.chdir(path)

更改当前目录。

uos.getcwd()

获取当前目录。

uos.ilistdir([dir])

这个函数返回一个迭代器,然后它产生与它列出的目录中的条目相对应的元组。不带参数列出当前目录,否则列出dir给出的目录。

元组的形式为 (name, type, inode[, size]):

  • name是一个字符串(如果dir是一个字节对象,则为字节)并且是条目的名称;

  • type是一个整数,指定条目的类型,0x4000 表示目录,0x8000 表示常规文件;

  • inode是与文件的 inode 对应的整数,对于没有这种概念的文件系统,可能为 0。

  • 某些平台可能会返回一个 4 元组,其中包括条目的size。对于文件条目,大小是表示文件大小的整数,如果未知,则为 -1。对于目录条目,其含义当前未定义。

uos.listdir([dir])

不带参数,列出当前目录。否则列出给定的目录。

uos.mkdir(path)

创建一个新目录。

uos.remove(path)

删除文件。

uos.rmdir(path)

删除目录。

uos.rename(old_path, new_path)

重命名文件。

uos.stat(path)

获取文件或目录的状态。

uos.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_availf_flags 参数可能会返回0 ,因为他们可以在一个端口的具体实施不可用。

uos.sync()

同步所有文件系统。

终端重定向和复制

uos.dupterm(stream_object, index=0, /)

在给定的类似stream对象上复制或切换 MicroPython 终端(REPL)。所述stream_object参数必须是一个本地流对象,或从导出uio.IOBase 并实施readinto()write()方法。流应该处于非阻塞模式,如果没有可供读取的数据, readinto() 应该返回 None

调用此函数后,所有终端输出都会在此流上重复,并且流上可用的任何输入都将传递到终端输入。

所述索引参数应该是哪个复制时隙设置一个非负整数,并且指定。一个给定的端口可以实现多个插槽(插槽 0 将始终可用),在这种情况下,终端输入和输出在所有设置的插槽上都是重复的。

如果None作为stream_object传递,则在index给定的插槽上取消重复。

该函数返回给定槽中的前一个类流对象。

文件系统挂载

一些端口提供了一个虚拟文件系统 (VFS) 和在这个 VFS 中挂载多个“真实”文件系统的能力。文件系统对象可以挂载在 VFS 的根目录中,也可以挂载在根目录中的子目录中。这允许对 Python 程序可见的文件系统进行动态和灵活的配置。具有此功能的端口提供mount()umount()功能,以及可能由 VFS 类表示的各种文件系统实现。

uos.mount(fsobj, mount_point, *, readonly)

将文件系统对象fsobj挂载到mount_point字符串给定的 VFS 中的位置 。 fsobj可以是具有mount() 方法或块设备的VFS 对象。如果它是块设备,则自动检测文件系统类型(如果没有识别出文件系统,则会引发异常)。 mount_point可能是'/' 将fsobj挂载在根目录,也可能是挂载在根'/<name>' 目录下的子目录。

如果只读,True则文件系统以只读方式挂载。

在挂载过程中,该方法mount() 在文件系统对象上被调用。

OSError(EPERM) 如果mount_point已经安装,则会引发。

uos.umount(mount_point)

卸载文件系统。mount_point可以是命名挂载位置的字符串,也可以是先前挂载的文件系统对象。在卸载过程中,该方法 umount()在文件系统对象上被调用。

OSError(EINVAL)如果未找到mount_point将引发。

class uos.VfsFat(block_dev)

创建一个使用 FAT 文件系统格式的文件系统对象。FAT 文件系统的存储由block_dev提供。由该构造函数创建的对象可以使用 mount().

static mkfs(block_dev)

在block_dev上构建 FAT 文件系统。

class uos.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 问题 347

class uos.VfsLfs2(block_dev, readsize=32, progsize=32, lookahead=32, mtime=True)

创建一个使用littlefs v2 文件系统格式的文件系统对象。littlefs 文件系统的存储由block_dev提供,它必须支持扩展接口。由该构造函数创建的对象可以使用 mount().

该修改时间参数使修改时间戳文件,使用littlefs属性存储。此选项可以在每个挂载时间以不同的方式禁用或启用,并且只有在启用mtime时才会添加或更新时间戳,否则时间戳将保持不变。没有时间戳的 Littlefs v2 文件系统无需重新格式化即可工作,一旦打开以进行写入,时间戳将透明地添加到现有文件中。在没有时间戳的文件 上启用mtime 时uos.stat ,时间戳将返回 0。

有关更多信息,请参阅使用文件系统

static mkfs(block_dev, readsize=32, progsize=32, lookahead=32)

建立在Lfs2文件系统block_dev。

注意

有报告称 littlefs v2 在某些情况下会失败,有关详细信息,请参阅 littlefs 问题 295

块设备

块设备是实现块协议的对象。这使设备能够支持 MicroPython 文件系统。物理硬件由用户定义的类表示。所述 AbstractBlockDev类是这样的类的设计的模板:MicroPython实际上并不提供类,但实际的块设备类必须实现的方法描述如下。

此类的具体实现通常允许访问一块硬件(如闪存)的类似内存的功能。块设备可以格式化为任何支持的文件系统并使用uos 方法挂载。

有关使用下面描述的块协议的两个变体的块设备的示例实现,请参阅使用文件系统

简单和扩展的界面

readblockswriteblocks 方法有两个兼容的签名(见下文),以支持各种用例。给定的块设备可以实现一种形式或另一种形式,或同时实现两种形式。第二种形式(带有偏移参数)被称为“扩展接口”。

一些需要对写入操作进行更多控制的文件系统(例如 littlefs),例如在不擦除的情况下写入子块区域,可能需要块设备支持扩展接口。

class uos.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的长度给出。

ioctl(op, arg)

控制块设备并查询其参数。要执行的操作由op给出,它是以下整数之一:

  • 1 –初始化设备(arg未使用)

  • 2 – 关闭设备(arg未使用)

  • 3 – 同步设备(arg未使用)

  • 4 – 获取块数的计数,应返回一个整数(arg未使用) is unused)

  • 5 – 获取块中的字节数,应该返回一个整数,或者None 在这种情况下使用默认值 512 (arg未使用)

  • 6 – 擦除一个块,arg是要擦除的块号

至少必须被拦截;因为 littlefs 也必须被拦截。对其他人的需求取决于硬件。 ioctl(4, ...) ioctl(6, ...)

除非另有说明可以退货。因此,实现可以忽略 的未使用值。在哪里 截取,操作4和5的返回值如上详述。其他操作应该在成功时返回 0,失败时返回非零,返回的值是一个errno 代码。 ioctl(op, arg) None. op. opOSError