1557 lines
57 KiB
Python
1557 lines
57 KiB
Python
"""
|
|
Basic "operating system" services.
|
|
|
|
MicroPython module: https://docs.micropython.org/en/v1.26.0/library/os.html
|
|
|
|
CPython module: :mod:`python:os` https://docs.python.org/3/library/os.html .
|
|
|
|
The ``os`` module contains functions for filesystem access and mounting,
|
|
terminal redirection and duplication, and the ``uname`` and ``urandom``
|
|
functions.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
import sys
|
|
from _typeshed import (
|
|
Incomplete,
|
|
AnyStr_co,
|
|
BytesPath,
|
|
FileDescriptor,
|
|
FileDescriptorLike,
|
|
FileDescriptorOrPath,
|
|
GenericPath,
|
|
OpenBinaryMode,
|
|
OpenBinaryModeReading,
|
|
OpenBinaryModeUpdating,
|
|
OpenBinaryModeWriting,
|
|
OpenTextMode,
|
|
ReadableBuffer,
|
|
StrOrBytesPath,
|
|
StrPath,
|
|
SupportsLenAndGetItem,
|
|
Unused,
|
|
WriteableBuffer,
|
|
structseq,
|
|
)
|
|
from abc import abstractmethod
|
|
from builtins import OSError
|
|
from collections.abc import Callable, Iterable, Iterator, Mapping, MutableMapping, Sequence
|
|
from contextlib import AbstractContextManager
|
|
from io import BufferedRandom, BufferedReader, BufferedWriter, FileIO, TextIOWrapper
|
|
from subprocess import Popen
|
|
from types import TracebackType
|
|
from typing import (
|
|
Iterator,
|
|
Optional,
|
|
Tuple,
|
|
Union,
|
|
IO,
|
|
Any,
|
|
AnyStr,
|
|
BinaryIO,
|
|
Final,
|
|
Generic,
|
|
Literal,
|
|
NoReturn,
|
|
Protocol,
|
|
TypeVar,
|
|
final,
|
|
overload,
|
|
runtime_checkable,
|
|
)
|
|
from typing_extensions import Awaitable, TypeVar, Self, TypeAlias, Unpack, deprecated
|
|
|
|
# from . import path as _path
|
|
from _mpy_shed import mp_available, uname_result
|
|
|
|
if sys.version_info >= (3, 9):
|
|
from types import GenericAlias
|
|
|
|
# This unnecessary alias is to work around various errors
|
|
# path = _path # type: ignore
|
|
|
|
_T = TypeVar("_T")
|
|
_T1 = TypeVar("_T1")
|
|
_T2 = TypeVar("_T2")
|
|
|
|
# ----- os variables -----
|
|
|
|
# error = OSError
|
|
|
|
# supports_bytes_environ: bool
|
|
|
|
# supports_dir_fd: set[Callable[..., Any]]
|
|
# supports_fd: set[Callable[..., Any]]
|
|
# supports_effective_ids: set[Callable[..., Any]]
|
|
# supports_follow_symlinks: set[Callable[..., Any]]
|
|
|
|
if sys.platform != "win32":
|
|
# Unix only
|
|
PRIO_PROCESS: int
|
|
PRIO_PGRP: int
|
|
PRIO_USER: int
|
|
|
|
F_LOCK: int
|
|
F_TLOCK: int
|
|
F_ULOCK: int
|
|
F_TEST: int
|
|
|
|
if sys.platform != "darwin":
|
|
POSIX_FADV_NORMAL: int
|
|
POSIX_FADV_SEQUENTIAL: int
|
|
POSIX_FADV_RANDOM: int
|
|
POSIX_FADV_NOREUSE: int
|
|
POSIX_FADV_WILLNEED: int
|
|
POSIX_FADV_DONTNEED: int
|
|
|
|
if sys.platform != "linux" and sys.platform != "darwin":
|
|
# In the os-module docs, these are marked as being available
|
|
# on "Unix, not Emscripten, not WASI."
|
|
# However, in the source code, a comment indicates they're "FreeBSD constants".
|
|
# sys.platform could have one of many values on a FreeBSD Python build,
|
|
# so the sys-module docs recommend doing `if sys.platform.startswith('freebsd')`
|
|
# to detect FreeBSD builds. Unfortunately that would be too dynamic
|
|
# for type checkers, however.
|
|
SF_NODISKIO: int
|
|
SF_MNOWAIT: int
|
|
SF_SYNC: int
|
|
|
|
if sys.version_info >= (3, 11):
|
|
SF_NOCACHE: int
|
|
|
|
if sys.platform == "linux":
|
|
XATTR_SIZE_MAX: int
|
|
XATTR_CREATE: int
|
|
XATTR_REPLACE: int
|
|
|
|
P_PID: int
|
|
P_PGID: int
|
|
P_ALL: int
|
|
|
|
if sys.platform == "linux" and sys.version_info >= (3, 9):
|
|
P_PIDFD: int
|
|
|
|
WEXITED: int
|
|
WSTOPPED: int
|
|
WNOWAIT: int
|
|
|
|
CLD_EXITED: int
|
|
CLD_DUMPED: int
|
|
CLD_TRAPPED: int
|
|
CLD_CONTINUED: int
|
|
|
|
if sys.version_info >= (3, 9):
|
|
CLD_KILLED: int
|
|
CLD_STOPPED: int
|
|
|
|
# TODO: SCHED_RESET_ON_FORK not available on darwin?
|
|
# TODO: SCHED_BATCH and SCHED_IDLE are linux only?
|
|
SCHED_OTHER: int # some flavors of Unix
|
|
SCHED_BATCH: int # some flavors of Unix
|
|
SCHED_IDLE: int # some flavors of Unix
|
|
SCHED_SPORADIC: int # some flavors of Unix
|
|
SCHED_FIFO: int # some flavors of Unix
|
|
SCHED_RR: int # some flavors of Unix
|
|
SCHED_RESET_ON_FORK: int # some flavors of Unix
|
|
|
|
if sys.platform != "win32":
|
|
RTLD_LAZY: int
|
|
RTLD_NOW: int
|
|
RTLD_GLOBAL: int
|
|
RTLD_LOCAL: int
|
|
RTLD_NODELETE: int
|
|
RTLD_NOLOAD: int
|
|
|
|
if sys.platform == "linux":
|
|
RTLD_DEEPBIND: int
|
|
GRND_NONBLOCK: int
|
|
GRND_RANDOM: int
|
|
|
|
if sys.platform == "darwin" and sys.version_info >= (3, 12):
|
|
PRIO_DARWIN_BG: int
|
|
PRIO_DARWIN_NONUI: int
|
|
PRIO_DARWIN_PROCESS: int
|
|
PRIO_DARWIN_THREAD: int
|
|
|
|
# SEEK_SET: int
|
|
# SEEK_CUR: int
|
|
# SEEK_END: int
|
|
if sys.platform != "win32":
|
|
SEEK_DATA: int # some flavors of Unix
|
|
SEEK_HOLE: int # some flavors of Unix
|
|
|
|
# O_RDONLY: int
|
|
# O_WRONLY: int
|
|
# O_RDWR: int
|
|
# O_APPEND: int
|
|
# O_CREAT: int
|
|
# O_EXCL: int
|
|
# O_TRUNC: int
|
|
# We don't use sys.platform for O_* flags to denote platform-dependent APIs because some codes,
|
|
# including tests for mypy, use a more finer way than sys.platform before using these APIs
|
|
# See https://github.com/python/typeshed/pull/2286 for discussions
|
|
# O_DSYNC: int # Unix only
|
|
# O_RSYNC: int # Unix only
|
|
# O_SYNC: int # Unix only
|
|
# O_NDELAY: int # Unix only
|
|
# O_NONBLOCK: int # Unix only
|
|
# O_NOCTTY: int # Unix only
|
|
# O_CLOEXEC: int # Unix only
|
|
# O_SHLOCK: int # Unix only
|
|
# O_EXLOCK: int # Unix only
|
|
# O_BINARY: int # Windows only
|
|
# O_NOINHERIT: int # Windows only
|
|
# O_SHORT_LIVED: int # Windows only
|
|
# O_TEMPORARY: int # Windows only
|
|
# O_RANDOM: int # Windows only
|
|
# O_SEQUENTIAL: int # Windows only
|
|
# O_TEXT: int # Windows only
|
|
# O_ASYNC: int # Gnu extension if in C library
|
|
# O_DIRECT: int # Gnu extension if in C library
|
|
# O_DIRECTORY: int # Gnu extension if in C library
|
|
# O_NOFOLLOW: int # Gnu extension if in C library
|
|
# O_NOATIME: int # Gnu extension if in C library
|
|
# O_PATH: int # Gnu extension if in C library
|
|
# O_TMPFILE: int # Gnu extension if in C library
|
|
# O_LARGEFILE: int # Gnu extension if in C library
|
|
# O_ACCMODE: int # TODO: when does this exist?
|
|
|
|
if sys.platform != "win32" and sys.platform != "darwin":
|
|
# posix, but apparently missing on macos
|
|
ST_APPEND: int
|
|
ST_MANDLOCK: int
|
|
ST_NOATIME: int
|
|
ST_NODEV: int
|
|
ST_NODIRATIME: int
|
|
ST_NOEXEC: int
|
|
ST_RELATIME: int
|
|
ST_SYNCHRONOUS: int
|
|
ST_WRITE: int
|
|
|
|
if sys.platform != "win32":
|
|
NGROUPS_MAX: int
|
|
ST_NOSUID: int
|
|
ST_RDONLY: int
|
|
|
|
# curdir: str
|
|
# pardir: str
|
|
# sep: str
|
|
if sys.platform == "win32":
|
|
altsep: str
|
|
else:
|
|
altsep: str | None
|
|
# extsep: str
|
|
# pathsep: str
|
|
# defpath: str
|
|
# linesep: str
|
|
# devnull: str
|
|
# name: str
|
|
|
|
# F_OK: int
|
|
# R_OK: int
|
|
# W_OK: int
|
|
# X_OK: int
|
|
|
|
_EnvironCodeFunc: TypeAlias = Callable[[AnyStr], AnyStr]
|
|
|
|
class _Environ(MutableMapping[AnyStr, AnyStr], Generic[AnyStr]):
|
|
encodekey: _EnvironCodeFunc[AnyStr]
|
|
decodekey: _EnvironCodeFunc[AnyStr]
|
|
encodevalue: _EnvironCodeFunc[AnyStr]
|
|
decodevalue: _EnvironCodeFunc[AnyStr]
|
|
if sys.version_info >= (3, 9):
|
|
def __init__(
|
|
self,
|
|
data: MutableMapping[AnyStr, AnyStr],
|
|
encodekey: _EnvironCodeFunc[AnyStr],
|
|
decodekey: _EnvironCodeFunc[AnyStr],
|
|
encodevalue: _EnvironCodeFunc[AnyStr],
|
|
decodevalue: _EnvironCodeFunc[AnyStr],
|
|
) -> None: ...
|
|
else:
|
|
putenv: Callable[[AnyStr, AnyStr], object]
|
|
unsetenv: Callable[[AnyStr, AnyStr], object]
|
|
def __init__(
|
|
self,
|
|
data: MutableMapping[AnyStr, AnyStr],
|
|
encodekey: _EnvironCodeFunc[AnyStr],
|
|
decodekey: _EnvironCodeFunc[AnyStr],
|
|
encodevalue: _EnvironCodeFunc[AnyStr],
|
|
decodevalue: _EnvironCodeFunc[AnyStr],
|
|
putenv: Callable[[AnyStr, AnyStr], object],
|
|
unsetenv: Callable[[AnyStr, AnyStr], object],
|
|
) -> None: ...
|
|
|
|
def setdefault(self, key: AnyStr, value: AnyStr) -> AnyStr: ...
|
|
def copy(self) -> dict[AnyStr, AnyStr]: ...
|
|
def __delitem__(self, key: AnyStr) -> None: ...
|
|
def __getitem__(self, key: AnyStr) -> AnyStr: ...
|
|
def __setitem__(self, key: AnyStr, value: AnyStr) -> None: ...
|
|
def __iter__(self) -> Iterator[AnyStr]: ...
|
|
def __len__(self) -> int: ...
|
|
if sys.version_info >= (3, 9):
|
|
def __or__(self, other: Mapping[_T1, _T2]) -> dict[AnyStr | _T1, AnyStr | _T2]: ...
|
|
def __ror__(self, other: Mapping[_T1, _T2]) -> dict[AnyStr | _T1, AnyStr | _T2]: ...
|
|
# We use @overload instead of a Union for reasons similar to those given for
|
|
# overloading MutableMapping.update in stdlib/typing.pyi
|
|
# The type: ignore is needed due to incompatible __or__/__ior__ signatures
|
|
@overload # type: ignore[misc]
|
|
def __ior__(self, other: Mapping[AnyStr, AnyStr]) -> Self: ...
|
|
@overload
|
|
def __ior__(self, other: Iterable[tuple[AnyStr, AnyStr]]) -> Self: ...
|
|
|
|
# environ: _Environ[str]
|
|
if sys.platform != "win32":
|
|
environb: _Environ[bytes]
|
|
|
|
if sys.version_info >= (3, 11) or sys.platform != "win32":
|
|
EX_OK: int
|
|
|
|
if sys.platform != "win32":
|
|
confstr_names: dict[str, int]
|
|
pathconf_names: dict[str, int]
|
|
sysconf_names: dict[str, int]
|
|
|
|
EX_USAGE: int
|
|
EX_DATAERR: int
|
|
EX_NOINPUT: int
|
|
EX_NOUSER: int
|
|
EX_NOHOST: int
|
|
EX_UNAVAILABLE: int
|
|
EX_SOFTWARE: int
|
|
EX_OSERR: int
|
|
EX_OSFILE: int
|
|
EX_CANTCREAT: int
|
|
EX_IOERR: int
|
|
EX_TEMPFAIL: int
|
|
EX_PROTOCOL: int
|
|
EX_NOPERM: int
|
|
EX_CONFIG: int
|
|
|
|
# Exists on some Unix platforms, e.g. Solaris.
|
|
if sys.platform != "win32" and sys.platform != "darwin" and sys.platform != "linux":
|
|
EX_NOTFOUND: int
|
|
|
|
# P_NOWAIT: int
|
|
# P_NOWAITO: int
|
|
# P_WAIT: int
|
|
if sys.platform == "win32":
|
|
P_DETACH: int
|
|
P_OVERLAY: int
|
|
|
|
# wait()/waitpid() options
|
|
if sys.platform != "win32":
|
|
WNOHANG: int # Unix only
|
|
WCONTINUED: int # some Unix systems
|
|
WUNTRACED: int # Unix only
|
|
|
|
# TMP_MAX: int # Undocumented, but used by tempfile
|
|
|
|
# ----- os classes (structures) -----
|
|
@final
|
|
class stat_result(structseq[float], tuple[int, int, int, int, int, int, int, float, float, float]):
|
|
# The constructor of this class takes an iterable of variable length (though it must be at least 10).
|
|
#
|
|
# However, this class behaves like a tuple of 10 elements,
|
|
# no matter how long the iterable supplied to the constructor is.
|
|
# https://github.com/python/typeshed/pull/6560#discussion_r767162532
|
|
#
|
|
# The 10 elements always present are st_mode, st_ino, st_dev, st_nlink,
|
|
# st_uid, st_gid, st_size, st_atime, st_mtime, st_ctime.
|
|
#
|
|
# More items may be added at the end by some implementations.
|
|
if sys.version_info >= (3, 10):
|
|
__match_args__: Final = ("st_mode", "st_ino", "st_dev", "st_nlink", "st_uid", "st_gid", "st_size")
|
|
|
|
@property
|
|
def st_mode(self) -> int: ... # protection bits,
|
|
@property
|
|
def st_ino(self) -> int: ... # inode number,
|
|
@property
|
|
def st_dev(self) -> int: ... # device,
|
|
@property
|
|
def st_nlink(self) -> int: ... # number of hard links,
|
|
@property
|
|
def st_uid(self) -> int: ... # user id of owner,
|
|
@property
|
|
def st_gid(self) -> int: ... # group id of owner,
|
|
@property
|
|
def st_size(self) -> int: ... # size of file, in bytes,
|
|
@property
|
|
def st_atime(self) -> float: ... # time of most recent access,
|
|
@property
|
|
def st_mtime(self) -> float: ... # time of most recent content modification,
|
|
# platform dependent (time of most recent metadata change on Unix, or the time of creation on Windows)
|
|
if sys.version_info >= (3, 12) and sys.platform == "win32":
|
|
@property
|
|
@deprecated(
|
|
"""\
|
|
Use st_birthtime instead to retrieve the file creation time. \
|
|
In the future, this property will contain the last metadata change time."""
|
|
)
|
|
def st_ctime(self) -> float: ...
|
|
else:
|
|
@property
|
|
def st_ctime(self) -> float: ...
|
|
|
|
@property
|
|
def st_atime_ns(self) -> int: ... # time of most recent access, in nanoseconds
|
|
@property
|
|
def st_mtime_ns(self) -> int: ... # time of most recent content modification in nanoseconds
|
|
# platform dependent (time of most recent metadata change on Unix, or the time of creation on Windows) in nanoseconds
|
|
@property
|
|
def st_ctime_ns(self) -> int: ...
|
|
if sys.platform == "win32":
|
|
@property
|
|
def st_file_attributes(self) -> int: ...
|
|
@property
|
|
def st_reparse_tag(self) -> int: ...
|
|
if sys.version_info >= (3, 12):
|
|
@property
|
|
def st_birthtime(self) -> float: ... # time of file creation in seconds
|
|
@property
|
|
def st_birthtime_ns(self) -> int: ... # time of file creation in nanoseconds
|
|
else:
|
|
@property
|
|
def st_blocks(self) -> int: ... # number of blocks allocated for file
|
|
@property
|
|
def st_blksize(self) -> int: ... # filesystem blocksize
|
|
@property
|
|
def st_rdev(self) -> int: ... # type of device if an inode device
|
|
if sys.platform != "linux":
|
|
# These properties are available on MacOS, but not Ubuntu.
|
|
# On other Unix systems (such as FreeBSD), the following attributes may be
|
|
# available (but may be only filled out if root tries to use them):
|
|
@property
|
|
def st_gen(self) -> int: ... # file generation number
|
|
@property
|
|
def st_birthtime(self) -> float: ... # time of file creation in seconds
|
|
if sys.platform == "darwin":
|
|
@property
|
|
def st_flags(self) -> int: ... # user defined flags for file
|
|
# Attributes documented as sometimes appearing, but deliberately omitted from the stub: `st_creator`, `st_rsize`, `st_type`.
|
|
# See https://github.com/python/typeshed/pull/6560#issuecomment-991253327
|
|
|
|
@runtime_checkable
|
|
class PathLike(Protocol[AnyStr_co]):
|
|
@abstractmethod
|
|
def __fspath__(self) -> AnyStr_co: ...
|
|
|
|
@overload
|
|
def listdir(path: StrPath | None = None) -> list[str]: ...
|
|
@overload
|
|
def listdir(path: BytesPath) -> list[bytes]: ...
|
|
@overload
|
|
def listdir(path: int) -> list[str]: ...
|
|
@mp_available() # force merge
|
|
def listdir(dir: Optional[Any] = None) -> Incomplete:
|
|
"""
|
|
With no argument, list the current directory. Otherwise list the given directory.
|
|
"""
|
|
...
|
|
|
|
@final
|
|
class DirEntry(Generic[AnyStr]):
|
|
# This is what the scandir iterator yields
|
|
# The constructor is hidden
|
|
|
|
@property
|
|
def name(self) -> AnyStr: ...
|
|
@property
|
|
def path(self) -> AnyStr: ...
|
|
def inode(self) -> int: ...
|
|
def is_dir(self, *, follow_symlinks: bool = True) -> bool: ...
|
|
def is_file(self, *, follow_symlinks: bool = True) -> bool: ...
|
|
def is_symlink(self) -> bool: ...
|
|
def stat(self, *, follow_symlinks: bool = True) -> stat_result: ...
|
|
def __fspath__(self) -> AnyStr: ...
|
|
if sys.version_info >= (3, 9):
|
|
def __class_getitem__(cls, item: Any, /) -> GenericAlias: ...
|
|
if sys.version_info >= (3, 12):
|
|
def is_junction(self) -> bool: ...
|
|
|
|
@final
|
|
class statvfs_result(structseq[int], tuple[int, int, int, int, int, int, int, int, int, int, int]):
|
|
if sys.version_info >= (3, 10):
|
|
__match_args__: Final = (
|
|
"f_bsize",
|
|
"f_frsize",
|
|
"f_blocks",
|
|
"f_bfree",
|
|
"f_bavail",
|
|
"f_files",
|
|
"f_ffree",
|
|
"f_favail",
|
|
"f_flag",
|
|
"f_namemax",
|
|
)
|
|
|
|
@property
|
|
def f_bsize(self) -> int: ...
|
|
@property
|
|
def f_frsize(self) -> int: ...
|
|
@property
|
|
def f_blocks(self) -> int: ...
|
|
@property
|
|
def f_bfree(self) -> int: ...
|
|
@property
|
|
def f_bavail(self) -> int: ...
|
|
@property
|
|
def f_files(self) -> int: ...
|
|
@property
|
|
def f_ffree(self) -> int: ...
|
|
@property
|
|
def f_favail(self) -> int: ...
|
|
@property
|
|
def f_flag(self) -> int: ...
|
|
@property
|
|
def f_namemax(self) -> int: ...
|
|
@property
|
|
def f_fsid(self) -> int: ...
|
|
|
|
# ----- os function stubs -----
|
|
def fsencode(filename: StrOrBytesPath) -> bytes: ...
|
|
def fsdecode(filename: StrOrBytesPath) -> str: ...
|
|
@overload
|
|
def fspath(path: str) -> str: ...
|
|
@overload
|
|
def fspath(path: bytes) -> bytes: ...
|
|
@overload
|
|
def fspath(path: PathLike[AnyStr]) -> AnyStr: ...
|
|
def get_exec_path(env: Mapping[str, str] | None = None) -> list[str]: ...
|
|
def getlogin() -> str: ...
|
|
def getpid() -> int: ...
|
|
def getppid() -> int: ...
|
|
def strerror(code: int, /) -> str: ...
|
|
def umask(mask: int, /) -> int: ...
|
|
@final
|
|
class uname_result(structseq[str], tuple[str, str, str, str, str]):
|
|
if sys.version_info >= (3, 10):
|
|
__match_args__: Final = ("sysname", "nodename", "release", "version", "machine")
|
|
|
|
@property
|
|
def sysname(self) -> str: ...
|
|
@property
|
|
def nodename(self) -> str: ...
|
|
@property
|
|
def release(self) -> str: ...
|
|
@property
|
|
def version(self) -> str: ...
|
|
@property
|
|
def machine(self) -> str: ...
|
|
|
|
if sys.platform != "win32":
|
|
def ctermid() -> str: ...
|
|
def getegid() -> int: ...
|
|
def geteuid() -> int: ...
|
|
def getgid() -> int: ...
|
|
def getgrouplist(user: str, group: int, /) -> list[int]: ...
|
|
def getgroups() -> list[int]: ... # Unix only, behaves differently on Mac
|
|
def initgroups(username: str, gid: int, /) -> None: ...
|
|
def getpgid(pid: int) -> int: ...
|
|
def getpgrp() -> int: ...
|
|
def getpriority(which: int, who: int) -> int: ...
|
|
def setpriority(which: int, who: int, priority: int) -> None: ...
|
|
if sys.platform != "darwin":
|
|
def getresuid() -> tuple[int, int, int]: ...
|
|
def getresgid() -> tuple[int, int, int]: ...
|
|
|
|
def getuid() -> int: ...
|
|
def setegid(egid: int, /) -> None: ...
|
|
def seteuid(euid: int, /) -> None: ...
|
|
def setgid(gid: int, /) -> None: ...
|
|
def setgroups(groups: Sequence[int], /) -> None: ...
|
|
def setpgrp() -> None: ...
|
|
def setpgid(pid: int, pgrp: int, /) -> None: ...
|
|
def setregid(rgid: int, egid: int, /) -> None: ...
|
|
if sys.platform != "darwin":
|
|
def setresgid(rgid: int, egid: int, sgid: int, /) -> None: ...
|
|
def setresuid(ruid: int, euid: int, suid: int, /) -> None: ...
|
|
|
|
def setreuid(ruid: int, euid: int, /) -> None: ...
|
|
def getsid(pid: int, /) -> int: ...
|
|
def setsid() -> None: ...
|
|
def setuid(uid: int, /) -> None: ...
|
|
def uname() -> uname_result:
|
|
"""
|
|
Return a tuple (possibly a named tuple) containing information about the
|
|
underlying machine and/or its operating system. The tuple has five fields
|
|
in the following order, each of them being a string:
|
|
|
|
* ``sysname`` -- the name of the underlying system
|
|
* ``nodename`` -- the network name (can be the same as ``sysname``)
|
|
* ``release`` -- the version of the underlying system
|
|
* ``version`` -- the MicroPython version and build date
|
|
* ``machine`` -- an identifier for the underlying hardware (eg board, CPU)
|
|
"""
|
|
...
|
|
|
|
@overload
|
|
def getenv(key: str) -> str | None: ...
|
|
@overload
|
|
def getenv(key: str, default: _T) -> str | _T: ...
|
|
|
|
if sys.platform != "win32":
|
|
@overload
|
|
def getenvb(key: bytes) -> bytes | None: ...
|
|
@overload
|
|
def getenvb(key: bytes, default: _T) -> bytes | _T: ...
|
|
def putenv(name: StrOrBytesPath, value: StrOrBytesPath, /) -> None: ...
|
|
def unsetenv(name: StrOrBytesPath, /) -> None: ...
|
|
|
|
else:
|
|
def putenv(name: str, value: str, /) -> None: ...
|
|
|
|
if sys.version_info >= (3, 9):
|
|
def unsetenv(name: str, /) -> None: ...
|
|
|
|
_Opener: TypeAlias = Callable[[str, int], int]
|
|
|
|
@overload
|
|
def fdopen(
|
|
fd: int,
|
|
mode: OpenTextMode = "r",
|
|
buffering: int = -1,
|
|
encoding: str | None = None,
|
|
errors: str | None = ...,
|
|
newline: str | None = ...,
|
|
closefd: bool = ...,
|
|
opener: _Opener | None = ...,
|
|
) -> TextIOWrapper: ...
|
|
@overload
|
|
def fdopen(
|
|
fd: int,
|
|
mode: OpenBinaryMode,
|
|
buffering: Literal[0],
|
|
encoding: None = None,
|
|
errors: None = None,
|
|
newline: None = None,
|
|
closefd: bool = ...,
|
|
opener: _Opener | None = ...,
|
|
) -> FileIO: ...
|
|
@overload
|
|
def fdopen(
|
|
fd: int,
|
|
mode: OpenBinaryModeUpdating,
|
|
buffering: Literal[-1, 1] = -1,
|
|
encoding: None = None,
|
|
errors: None = None,
|
|
newline: None = None,
|
|
closefd: bool = ...,
|
|
opener: _Opener | None = ...,
|
|
) -> BufferedRandom: ...
|
|
@overload
|
|
def fdopen(
|
|
fd: int,
|
|
mode: OpenBinaryModeWriting,
|
|
buffering: Literal[-1, 1] = -1,
|
|
encoding: None = None,
|
|
errors: None = None,
|
|
newline: None = None,
|
|
closefd: bool = ...,
|
|
opener: _Opener | None = ...,
|
|
) -> BufferedWriter: ...
|
|
@overload
|
|
def fdopen(
|
|
fd: int,
|
|
mode: OpenBinaryModeReading,
|
|
buffering: Literal[-1, 1] = -1,
|
|
encoding: None = None,
|
|
errors: None = None,
|
|
newline: None = None,
|
|
closefd: bool = ...,
|
|
opener: _Opener | None = ...,
|
|
) -> BufferedReader: ...
|
|
@overload
|
|
def fdopen(
|
|
fd: int,
|
|
mode: OpenBinaryMode,
|
|
buffering: int = -1,
|
|
encoding: None = None,
|
|
errors: None = None,
|
|
newline: None = None,
|
|
closefd: bool = ...,
|
|
opener: _Opener | None = ...,
|
|
) -> BinaryIO: ...
|
|
@overload
|
|
def fdopen(
|
|
fd: int,
|
|
mode: str,
|
|
buffering: int = -1,
|
|
encoding: str | None = None,
|
|
errors: str | None = ...,
|
|
newline: str | None = ...,
|
|
closefd: bool = ...,
|
|
opener: _Opener | None = ...,
|
|
) -> IO[Any]: ...
|
|
def close(fd: int) -> None: ...
|
|
def closerange(fd_low: int, fd_high: int, /) -> None: ...
|
|
def device_encoding(fd: int) -> str | None: ...
|
|
def dup(fd: int, /) -> int: ...
|
|
def dup2(fd: int, fd2: int, inheritable: bool = True) -> int: ...
|
|
def fstat(fd: int) -> stat_result: ...
|
|
def ftruncate(fd: int, length: int, /) -> None: ...
|
|
def fsync(fd: FileDescriptorLike) -> None: ...
|
|
def isatty(fd: int, /) -> bool: ...
|
|
|
|
if sys.platform != "win32" and sys.version_info >= (3, 11):
|
|
def login_tty(fd: int, /) -> None: ...
|
|
|
|
if sys.version_info >= (3, 11):
|
|
def lseek(fd: int, position: int, whence: int, /) -> int: ...
|
|
|
|
else:
|
|
def lseek(fd: int, position: int, how: int, /) -> int: ...
|
|
|
|
def open(path: StrOrBytesPath, flags: int, mode: int = 0o777, *, dir_fd: int | None = None) -> int: ...
|
|
def pipe() -> tuple[int, int]: ...
|
|
def read(fd: int, length: int, /) -> bytes: ...
|
|
|
|
if sys.version_info >= (3, 12) or sys.platform != "win32":
|
|
def get_blocking(fd: int, /) -> bool: ...
|
|
def set_blocking(fd: int, blocking: bool, /) -> None: ...
|
|
|
|
if sys.platform != "win32":
|
|
def fchown(fd: int, uid: int, gid: int) -> None: ...
|
|
def fpathconf(fd: int, name: str | int, /) -> int: ...
|
|
def fstatvfs(fd: int, /) -> statvfs_result: ...
|
|
def lockf(fd: int, command: int, length: int, /) -> None: ...
|
|
def openpty() -> tuple[int, int]: ... # some flavors of Unix
|
|
if sys.platform != "darwin":
|
|
def fdatasync(fd: FileDescriptorLike) -> None: ...
|
|
def pipe2(flags: int, /) -> tuple[int, int]: ... # some flavors of Unix
|
|
def posix_fallocate(fd: int, offset: int, length: int, /) -> None: ...
|
|
def posix_fadvise(fd: int, offset: int, length: int, advice: int, /) -> None: ...
|
|
|
|
def pread(fd: int, length: int, offset: int, /) -> bytes: ...
|
|
def pwrite(fd: int, buffer: ReadableBuffer, offset: int, /) -> int: ...
|
|
# In CI, stubtest sometimes reports that these are available on MacOS, sometimes not
|
|
def preadv(fd: int, buffers: SupportsLenAndGetItem[WriteableBuffer], offset: int, flags: int = 0, /) -> int: ...
|
|
def pwritev(fd: int, buffers: SupportsLenAndGetItem[ReadableBuffer], offset: int, flags: int = 0, /) -> int: ...
|
|
if sys.platform != "darwin":
|
|
if sys.version_info >= (3, 10):
|
|
RWF_APPEND: int # docs say available on 3.7+, stubtest says otherwise
|
|
RWF_DSYNC: int
|
|
RWF_SYNC: int
|
|
RWF_HIPRI: int
|
|
RWF_NOWAIT: int
|
|
|
|
if sys.platform == "linux":
|
|
def sendfile(out_fd: FileDescriptor, in_fd: FileDescriptor, offset: int | None, count: int) -> int: ...
|
|
else:
|
|
def sendfile(
|
|
out_fd: FileDescriptor,
|
|
in_fd: FileDescriptor,
|
|
offset: int,
|
|
count: int,
|
|
headers: Sequence[ReadableBuffer] = ...,
|
|
trailers: Sequence[ReadableBuffer] = ...,
|
|
flags: int = 0,
|
|
) -> int: ... # FreeBSD and Mac OS X only
|
|
|
|
def readv(fd: int, buffers: SupportsLenAndGetItem[WriteableBuffer], /) -> int: ...
|
|
def writev(fd: int, buffers: SupportsLenAndGetItem[ReadableBuffer], /) -> int: ...
|
|
|
|
@final
|
|
class terminal_size(structseq[int], tuple[int, int]):
|
|
if sys.version_info >= (3, 10):
|
|
__match_args__: Final = ("columns", "lines")
|
|
|
|
@property
|
|
def columns(self) -> int: ...
|
|
@property
|
|
def lines(self) -> int: ...
|
|
|
|
def get_terminal_size(fd: int = ..., /) -> terminal_size: ...
|
|
def get_inheritable(fd: int, /) -> bool: ...
|
|
def set_inheritable(fd: int, inheritable: bool, /) -> None: ...
|
|
|
|
if sys.platform == "win32":
|
|
def get_handle_inheritable(handle: int, /) -> bool: ...
|
|
def set_handle_inheritable(handle: int, inheritable: bool, /) -> None: ...
|
|
|
|
if sys.platform != "win32":
|
|
# Unix only
|
|
def tcgetpgrp(fd: int, /) -> int: ...
|
|
def tcsetpgrp(fd: int, pgid: int, /) -> None: ...
|
|
def ttyname(fd: int, /) -> str: ...
|
|
|
|
def write(fd: int, data: ReadableBuffer, /) -> int: ...
|
|
def access(
|
|
path: FileDescriptorOrPath, mode: int, *, dir_fd: int | None = None, effective_ids: bool = False, follow_symlinks: bool = True
|
|
) -> bool: ...
|
|
@mp_available() # force merge
|
|
def chdir(path) -> Incomplete:
|
|
"""
|
|
Change current directory.
|
|
"""
|
|
...
|
|
|
|
if sys.platform != "win32":
|
|
def fchdir(fd: FileDescriptorLike) -> None: ...
|
|
|
|
@mp_available() # force merge
|
|
def getcwd() -> Incomplete:
|
|
"""
|
|
Get the current directory.
|
|
"""
|
|
...
|
|
|
|
def getcwdb() -> bytes: ...
|
|
def chmod(path: FileDescriptorOrPath, mode: int, *, dir_fd: int | None = None, follow_symlinks: bool = ...) -> None: ...
|
|
|
|
if sys.platform != "win32" and sys.platform != "linux":
|
|
def chflags(path: StrOrBytesPath, flags: int, follow_symlinks: bool = True) -> None: ... # some flavors of Unix
|
|
def lchflags(path: StrOrBytesPath, flags: int) -> None: ...
|
|
|
|
if sys.platform != "win32":
|
|
def chroot(path: StrOrBytesPath) -> None: ...
|
|
def chown(path: FileDescriptorOrPath, uid: int, gid: int, *, dir_fd: int | None = None, follow_symlinks: bool = True) -> None: ...
|
|
def lchown(path: StrOrBytesPath, uid: int, gid: int) -> None: ...
|
|
|
|
def link(
|
|
src: StrOrBytesPath,
|
|
dst: StrOrBytesPath,
|
|
*,
|
|
src_dir_fd: int | None = None,
|
|
dst_dir_fd: int | None = None,
|
|
follow_symlinks: bool = True,
|
|
) -> None: ...
|
|
def lstat(path: StrOrBytesPath, *, dir_fd: int | None = None) -> stat_result: ...
|
|
@mp_available() # force merge
|
|
def mkdir(path) -> Incomplete:
|
|
"""
|
|
Create a new directory.
|
|
"""
|
|
...
|
|
|
|
if sys.platform != "win32":
|
|
def mkfifo(path: StrOrBytesPath, mode: int = 0o666, *, dir_fd: int | None = None) -> None: ... # Unix only
|
|
|
|
def makedirs(name: StrOrBytesPath, mode: int = 0o777, exist_ok: bool = False) -> None: ...
|
|
|
|
if sys.platform != "win32":
|
|
def mknod(path: StrOrBytesPath, mode: int = 0o600, device: int = 0, *, dir_fd: int | None = None) -> None: ...
|
|
def major(device: int, /) -> int: ...
|
|
def minor(device: int, /) -> int: ...
|
|
def makedev(major: int, minor: int, /) -> int: ...
|
|
def pathconf(path: FileDescriptorOrPath, name: str | int) -> int: ... # Unix only
|
|
|
|
def readlink(path: GenericPath[AnyStr], *, dir_fd: int | None = None) -> AnyStr: ...
|
|
@mp_available() # force merge
|
|
def remove(path) -> None:
|
|
"""
|
|
Remove a file.
|
|
"""
|
|
...
|
|
|
|
def removedirs(name: StrOrBytesPath) -> None: ...
|
|
@mp_available() # force merge
|
|
def rename(old_path, new_path) -> None:
|
|
"""
|
|
Rename a file.
|
|
"""
|
|
...
|
|
|
|
def renames(old: StrOrBytesPath, new: StrOrBytesPath) -> None: ...
|
|
def replace(src: StrOrBytesPath, dst: StrOrBytesPath, *, src_dir_fd: int | None = None, dst_dir_fd: int | None = None) -> None: ...
|
|
@mp_available() # force merge
|
|
def rmdir(path) -> None:
|
|
"""
|
|
Remove a directory.
|
|
"""
|
|
...
|
|
|
|
class _ScandirIterator(Iterator[DirEntry[AnyStr]], AbstractContextManager[_ScandirIterator[AnyStr], None]):
|
|
def __next__(self) -> DirEntry[AnyStr]: ...
|
|
def __exit__(self, *args: Unused) -> None: ...
|
|
def close(self) -> None: ...
|
|
|
|
@overload
|
|
def scandir(path: None = None) -> _ScandirIterator[str]: ...
|
|
@overload
|
|
def scandir(path: int) -> _ScandirIterator[str]: ...
|
|
@overload
|
|
def scandir(path: GenericPath[AnyStr]) -> _ScandirIterator[AnyStr]: ...
|
|
def stat(path: str | bytes) -> stat_result:
|
|
"""
|
|
Get the status of a file or directory.
|
|
"""
|
|
...
|
|
|
|
if sys.platform != "win32":
|
|
|
|
@mp_available() # force merge
|
|
def statvfs(path) -> Tuple:
|
|
"""
|
|
Get the status of a filesystem.
|
|
|
|
Returns a tuple with the filesystem information in the following order:
|
|
|
|
* ``f_bsize`` -- file system block size
|
|
* ``f_frsize`` -- fragment size
|
|
* ``f_blocks`` -- size of fs in f_frsize units
|
|
* ``f_bfree`` -- number of free blocks
|
|
* ``f_bavail`` -- number of free blocks for unprivileged users
|
|
* ``f_files`` -- number of inodes
|
|
* ``f_ffree`` -- number of free inodes
|
|
* ``f_favail`` -- number of free inodes for unprivileged users
|
|
* ``f_flag`` -- mount flags
|
|
* ``f_namemax`` -- maximum filename length
|
|
|
|
Parameters related to inodes: ``f_files``, ``f_ffree``, ``f_avail``
|
|
and the ``f_flags`` parameter may return ``0`` as they can be unavailable
|
|
in a port-specific implementation.
|
|
"""
|
|
...
|
|
|
|
def symlink(src: StrOrBytesPath, dst: StrOrBytesPath, target_is_directory: bool = False, *, dir_fd: int | None = None) -> None: ...
|
|
|
|
if sys.platform != "win32":
|
|
|
|
@mp_available() # force merge
|
|
def sync() -> None:
|
|
"""
|
|
Sync all filesystems.
|
|
"""
|
|
...
|
|
|
|
def truncate(path: FileDescriptorOrPath, length: int) -> None: ... # Unix only up to version 3.4
|
|
def unlink(path: StrOrBytesPath, *, dir_fd: int | None = None) -> None: ...
|
|
def utime(
|
|
path: FileDescriptorOrPath,
|
|
times: tuple[int, int] | tuple[float, float] | None = None,
|
|
*,
|
|
ns: tuple[int, int] = ...,
|
|
dir_fd: int | None = None,
|
|
follow_symlinks: bool = True,
|
|
) -> None: ...
|
|
|
|
_OnError: TypeAlias = Callable[[OSError], object]
|
|
|
|
def walk(
|
|
top: GenericPath[AnyStr], topdown: bool = True, onerror: _OnError | None = None, followlinks: bool = False
|
|
) -> Iterator[tuple[AnyStr, list[AnyStr], list[AnyStr]]]: ...
|
|
|
|
if sys.platform != "win32":
|
|
@overload
|
|
def fwalk(
|
|
top: StrPath = ".",
|
|
topdown: bool = True,
|
|
onerror: _OnError | None = None,
|
|
*,
|
|
follow_symlinks: bool = False,
|
|
dir_fd: int | None = None,
|
|
) -> Iterator[tuple[str, list[str], list[str], int]]: ...
|
|
@overload
|
|
def fwalk(
|
|
top: BytesPath,
|
|
topdown: bool = True,
|
|
onerror: _OnError | None = None,
|
|
*,
|
|
follow_symlinks: bool = False,
|
|
dir_fd: int | None = None,
|
|
) -> Iterator[tuple[bytes, list[bytes], list[bytes], int]]: ...
|
|
if sys.platform == "linux":
|
|
def getxattr(path: FileDescriptorOrPath, attribute: StrOrBytesPath, *, follow_symlinks: bool = True) -> bytes: ...
|
|
def listxattr(path: FileDescriptorOrPath | None = None, *, follow_symlinks: bool = True) -> list[str]: ...
|
|
def removexattr(path: FileDescriptorOrPath, attribute: StrOrBytesPath, *, follow_symlinks: bool = True) -> None: ...
|
|
def setxattr(
|
|
path: FileDescriptorOrPath,
|
|
attribute: StrOrBytesPath,
|
|
value: ReadableBuffer,
|
|
flags: int = 0,
|
|
*,
|
|
follow_symlinks: bool = True,
|
|
) -> None: ...
|
|
|
|
def abort() -> NoReturn: ...
|
|
|
|
# These are defined as execl(file, *args) but the first *arg is mandatory.
|
|
def execl(file: StrOrBytesPath, *args: Unpack[tuple[StrOrBytesPath, Unpack[tuple[StrOrBytesPath, ...]]]]) -> NoReturn: ...
|
|
def execlp(file: StrOrBytesPath, *args: Unpack[tuple[StrOrBytesPath, Unpack[tuple[StrOrBytesPath, ...]]]]) -> NoReturn: ...
|
|
|
|
# These are: execle(file, *args, env) but env is pulled from the last element of the args.
|
|
def execle(file: StrOrBytesPath, *args: Unpack[tuple[StrOrBytesPath, Unpack[tuple[StrOrBytesPath, ...]], _ExecEnv]]) -> NoReturn: ...
|
|
def execlpe(file: StrOrBytesPath, *args: Unpack[tuple[StrOrBytesPath, Unpack[tuple[StrOrBytesPath, ...]], _ExecEnv]]) -> NoReturn: ...
|
|
|
|
# The docs say `args: tuple or list of strings`
|
|
# The implementation enforces tuple or list so we can't use Sequence.
|
|
# Not separating out PathLike[str] and PathLike[bytes] here because it doesn't make much difference
|
|
# in practice, and doing so would explode the number of combinations in this already long union.
|
|
# All these combinations are necessary due to list being invariant.
|
|
_ExecVArgs: TypeAlias = (
|
|
tuple[StrOrBytesPath, ...]
|
|
| list[bytes]
|
|
| list[str]
|
|
| list[PathLike[Any]]
|
|
| list[bytes | str]
|
|
| list[bytes | PathLike[Any]]
|
|
| list[str | PathLike[Any]]
|
|
| list[bytes | str | PathLike[Any]]
|
|
)
|
|
# Depending on the OS, the keys and values are passed either to
|
|
# PyUnicode_FSDecoder (which accepts str | ReadableBuffer) or to
|
|
# PyUnicode_FSConverter (which accepts StrOrBytesPath). For simplicity,
|
|
# we limit to str | bytes.
|
|
_ExecEnv: TypeAlias = Mapping[bytes, bytes | str] | Mapping[str, bytes | str]
|
|
|
|
def execv(path: StrOrBytesPath, argv: _ExecVArgs, /) -> NoReturn: ...
|
|
def execve(path: FileDescriptorOrPath, argv: _ExecVArgs, env: _ExecEnv) -> NoReturn: ...
|
|
def execvp(file: StrOrBytesPath, args: _ExecVArgs) -> NoReturn: ...
|
|
def execvpe(file: StrOrBytesPath, args: _ExecVArgs, env: _ExecEnv) -> NoReturn: ...
|
|
|
|
# def _exit(status: int) -> NoReturn: ...
|
|
def kill(pid: int, signal: int, /) -> None: ...
|
|
|
|
if sys.platform != "win32":
|
|
# Unix only
|
|
def fork() -> int: ...
|
|
def forkpty() -> tuple[int, int]: ... # some flavors of Unix
|
|
def killpg(pgid: int, signal: int, /) -> None: ...
|
|
def nice(increment: int, /) -> int: ...
|
|
if sys.platform != "darwin" and sys.platform != "linux":
|
|
def plock(op: int, /) -> None: ...
|
|
|
|
class _wrap_close:
|
|
def __init__(self, stream: TextIOWrapper, proc: Popen[str]) -> None: ...
|
|
def close(self) -> int | None: ...
|
|
def __enter__(self) -> Self: ...
|
|
def __exit__(self, exc_type: type[BaseException] | None, exc_val: BaseException | None, exc_tb: TracebackType | None) -> None: ...
|
|
def __iter__(self) -> Iterator[str]: ...
|
|
# Methods below here don't exist directly on the _wrap_close object, but
|
|
# are copied from the wrapped TextIOWrapper object via __getattr__.
|
|
# The full set of TextIOWrapper methods are technically available this way,
|
|
# but undocumented. Only a subset are currently included here.
|
|
def read(self, size: int | None = -1, /) -> str: ...
|
|
def readable(self) -> bool: ...
|
|
def readline(self, size: int = -1, /) -> str: ...
|
|
def readlines(self, hint: int = -1, /) -> list[str]: ...
|
|
def writable(self) -> bool: ...
|
|
def write(self, s: str, /) -> int: ...
|
|
def writelines(self, lines: Iterable[str], /) -> None: ...
|
|
|
|
def popen(cmd: str, mode: str = "r", buffering: int = -1) -> _wrap_close: ...
|
|
def spawnl(mode: int, file: StrOrBytesPath, arg0: StrOrBytesPath, *args: StrOrBytesPath) -> int: ...
|
|
def spawnle(mode: int, file: StrOrBytesPath, arg0: StrOrBytesPath, *args: Any) -> int: ... # Imprecise sig
|
|
|
|
if sys.platform != "win32":
|
|
def spawnv(mode: int, file: StrOrBytesPath, args: _ExecVArgs) -> int: ...
|
|
def spawnve(mode: int, file: StrOrBytesPath, args: _ExecVArgs, env: _ExecEnv) -> int: ...
|
|
|
|
else:
|
|
def spawnv(mode: int, path: StrOrBytesPath, argv: _ExecVArgs, /) -> int: ...
|
|
def spawnve(mode: int, path: StrOrBytesPath, argv: _ExecVArgs, env: _ExecEnv, /) -> int: ...
|
|
|
|
def system(command: StrOrBytesPath) -> int: ...
|
|
@final
|
|
class times_result(structseq[float], tuple[float, float, float, float, float]):
|
|
if sys.version_info >= (3, 10):
|
|
__match_args__: Final = ("user", "system", "children_user", "children_system", "elapsed")
|
|
|
|
@property
|
|
def user(self) -> float: ...
|
|
@property
|
|
def system(self) -> float: ...
|
|
@property
|
|
def children_user(self) -> float: ...
|
|
@property
|
|
def children_system(self) -> float: ...
|
|
@property
|
|
def elapsed(self) -> float: ...
|
|
|
|
def times() -> times_result: ...
|
|
def waitpid(pid: int, options: int, /) -> tuple[int, int]: ...
|
|
|
|
if sys.platform == "win32":
|
|
if sys.version_info >= (3, 10):
|
|
def startfile(
|
|
filepath: StrOrBytesPath,
|
|
operation: str = ...,
|
|
arguments: str = "",
|
|
cwd: StrOrBytesPath | None = None,
|
|
show_cmd: int = 1,
|
|
) -> None: ...
|
|
else:
|
|
def startfile(filepath: StrOrBytesPath, operation: str = ...) -> None: ...
|
|
|
|
else:
|
|
def spawnlp(mode: int, file: StrOrBytesPath, arg0: StrOrBytesPath, *args: StrOrBytesPath) -> int: ...
|
|
def spawnlpe(mode: int, file: StrOrBytesPath, arg0: StrOrBytesPath, *args: Any) -> int: ... # Imprecise signature
|
|
def spawnvp(mode: int, file: StrOrBytesPath, args: _ExecVArgs) -> int: ...
|
|
def spawnvpe(mode: int, file: StrOrBytesPath, args: _ExecVArgs, env: _ExecEnv) -> int: ...
|
|
def wait() -> tuple[int, int]: ... # Unix only
|
|
# Added to MacOS in 3.13
|
|
if sys.platform != "darwin" or sys.version_info >= (3, 13):
|
|
@final
|
|
class waitid_result(structseq[int], tuple[int, int, int, int, int]):
|
|
if sys.version_info >= (3, 10):
|
|
__match_args__: Final = ("si_pid", "si_uid", "si_signo", "si_status", "si_code")
|
|
|
|
@property
|
|
def si_pid(self) -> int: ...
|
|
@property
|
|
def si_uid(self) -> int: ...
|
|
@property
|
|
def si_signo(self) -> int: ...
|
|
@property
|
|
def si_status(self) -> int: ...
|
|
@property
|
|
def si_code(self) -> int: ...
|
|
|
|
def waitid(idtype: int, ident: int, options: int, /) -> waitid_result | None: ...
|
|
|
|
from resource import struct_rusage
|
|
|
|
def wait3(options: int) -> tuple[int, int, struct_rusage]: ...
|
|
def wait4(pid: int, options: int) -> tuple[int, int, struct_rusage]: ...
|
|
def WCOREDUMP(status: int, /) -> bool: ...
|
|
def WIFCONTINUED(status: int) -> bool: ...
|
|
def WIFSTOPPED(status: int) -> bool: ...
|
|
def WIFSIGNALED(status: int) -> bool: ...
|
|
def WIFEXITED(status: int) -> bool: ...
|
|
def WEXITSTATUS(status: int) -> int: ...
|
|
def WSTOPSIG(status: int) -> int: ...
|
|
def WTERMSIG(status: int) -> int: ...
|
|
def posix_spawn(
|
|
path: StrOrBytesPath,
|
|
argv: _ExecVArgs,
|
|
env: _ExecEnv,
|
|
/,
|
|
*,
|
|
file_actions: Sequence[tuple[Any, ...]] | None = ...,
|
|
setpgroup: int | None = ...,
|
|
resetids: bool = ...,
|
|
setsid: bool = ...,
|
|
setsigmask: Iterable[int] = ...,
|
|
setsigdef: Iterable[int] = ...,
|
|
scheduler: tuple[Any, sched_param] | None = ...,
|
|
) -> int: ...
|
|
def posix_spawnp(
|
|
path: StrOrBytesPath,
|
|
argv: _ExecVArgs,
|
|
env: _ExecEnv,
|
|
/,
|
|
*,
|
|
file_actions: Sequence[tuple[Any, ...]] | None = ...,
|
|
setpgroup: int | None = ...,
|
|
resetids: bool = ...,
|
|
setsid: bool = ...,
|
|
setsigmask: Iterable[int] = ...,
|
|
setsigdef: Iterable[int] = ...,
|
|
scheduler: tuple[Any, sched_param] | None = ...,
|
|
) -> int: ...
|
|
POSIX_SPAWN_OPEN: int
|
|
POSIX_SPAWN_CLOSE: int
|
|
POSIX_SPAWN_DUP2: int
|
|
|
|
if sys.platform != "win32":
|
|
@final
|
|
class sched_param(structseq[int], tuple[int]):
|
|
if sys.version_info >= (3, 10):
|
|
__match_args__: Final = ("sched_priority",)
|
|
|
|
def __new__(cls, sched_priority: int) -> Self: ...
|
|
@property
|
|
def sched_priority(self) -> int: ...
|
|
|
|
def sched_get_priority_min(policy: int) -> int: ... # some flavors of Unix
|
|
def sched_get_priority_max(policy: int) -> int: ... # some flavors of Unix
|
|
def sched_yield() -> None: ... # some flavors of Unix
|
|
if sys.platform != "darwin":
|
|
def sched_setscheduler(pid: int, policy: int, param: sched_param, /) -> None: ... # some flavors of Unix
|
|
def sched_getscheduler(pid: int, /) -> int: ... # some flavors of Unix
|
|
def sched_rr_get_interval(pid: int, /) -> float: ... # some flavors of Unix
|
|
def sched_setparam(pid: int, param: sched_param, /) -> None: ... # some flavors of Unix
|
|
def sched_getparam(pid: int, /) -> sched_param: ... # some flavors of Unix
|
|
def sched_setaffinity(pid: int, mask: Iterable[int], /) -> None: ... # some flavors of Unix
|
|
def sched_getaffinity(pid: int, /) -> set[int]: ... # some flavors of Unix
|
|
|
|
def cpu_count() -> int | None: ...
|
|
|
|
if sys.version_info >= (3, 13):
|
|
# Documented to return `int | None`, but falls back to `len(sched_getaffinity(0))` when
|
|
# available. See https://github.com/python/cpython/blob/417c130/Lib/os.py#L1175-L1186.
|
|
if sys.platform != "win32" and sys.platform != "darwin":
|
|
def process_cpu_count() -> int: ...
|
|
else:
|
|
def process_cpu_count() -> int | None: ...
|
|
|
|
if sys.platform != "win32":
|
|
# Unix only
|
|
def confstr(name: str | int, /) -> str | None: ...
|
|
def getloadavg() -> tuple[float, float, float]: ...
|
|
def sysconf(name: str | int, /) -> int: ...
|
|
|
|
if sys.platform == "linux":
|
|
def getrandom(size: int, flags: int = 0) -> bytes: ...
|
|
|
|
@mp_available() # force merge
|
|
def urandom(n: int) -> bytes:
|
|
"""
|
|
Return a bytes object with *n* random bytes. Whenever possible, it is
|
|
generated by the hardware random number generator.
|
|
"""
|
|
...
|
|
|
|
if sys.platform != "win32":
|
|
def register_at_fork(
|
|
*,
|
|
before: Callable[..., Any] | None = ...,
|
|
after_in_parent: Callable[..., Any] | None = ...,
|
|
after_in_child: Callable[..., Any] | None = ...,
|
|
) -> None: ...
|
|
|
|
if sys.platform == "win32":
|
|
class _AddedDllDirectory:
|
|
path: str | None
|
|
def __init__(self, path: str | None, cookie: _T, remove_dll_directory: Callable[[_T], object]) -> None: ...
|
|
def close(self) -> None: ...
|
|
def __enter__(self) -> Self: ...
|
|
def __exit__(self, *args: Unused) -> None: ...
|
|
|
|
def add_dll_directory(path: str) -> _AddedDllDirectory: ...
|
|
|
|
if sys.platform == "linux":
|
|
MFD_CLOEXEC: int
|
|
MFD_ALLOW_SEALING: int
|
|
MFD_HUGETLB: int
|
|
MFD_HUGE_SHIFT: int
|
|
MFD_HUGE_MASK: int
|
|
MFD_HUGE_64KB: int
|
|
MFD_HUGE_512KB: int
|
|
MFD_HUGE_1MB: int
|
|
MFD_HUGE_2MB: int
|
|
MFD_HUGE_8MB: int
|
|
MFD_HUGE_16MB: int
|
|
MFD_HUGE_32MB: int
|
|
MFD_HUGE_256MB: int
|
|
MFD_HUGE_512MB: int
|
|
MFD_HUGE_1GB: int
|
|
MFD_HUGE_2GB: int
|
|
MFD_HUGE_16GB: int
|
|
def memfd_create(name: str, flags: int = ...) -> int: ...
|
|
def copy_file_range(src: int, dst: int, count: int, offset_src: int | None = ..., offset_dst: int | None = ...) -> int: ...
|
|
|
|
if sys.version_info >= (3, 9):
|
|
def waitstatus_to_exitcode(status: int) -> int: ...
|
|
|
|
if sys.platform == "linux":
|
|
def pidfd_open(pid: int, flags: int = ...) -> int: ...
|
|
|
|
if sys.version_info >= (3, 12) and sys.platform == "win32":
|
|
def listdrives() -> list[str]: ...
|
|
def listmounts(volume: str) -> list[str]: ...
|
|
def listvolumes() -> list[str]: ...
|
|
|
|
if sys.version_info >= (3, 10) and sys.platform == "linux":
|
|
EFD_CLOEXEC: int
|
|
EFD_NONBLOCK: int
|
|
EFD_SEMAPHORE: int
|
|
SPLICE_F_MORE: int
|
|
SPLICE_F_MOVE: int
|
|
SPLICE_F_NONBLOCK: int
|
|
def eventfd(initval: int, flags: int = 524288) -> FileDescriptor: ...
|
|
def eventfd_read(fd: FileDescriptor) -> int: ...
|
|
def eventfd_write(fd: FileDescriptor, value: int) -> None: ...
|
|
def splice(
|
|
src: FileDescriptor,
|
|
dst: FileDescriptor,
|
|
count: int,
|
|
offset_src: int | None = ...,
|
|
offset_dst: int | None = ...,
|
|
flags: int = 0,
|
|
) -> int: ...
|
|
|
|
if sys.version_info >= (3, 12) and sys.platform == "linux":
|
|
CLONE_FILES: int
|
|
CLONE_FS: int
|
|
CLONE_NEWCGROUP: int # Linux 4.6+
|
|
CLONE_NEWIPC: int # Linux 2.6.19+
|
|
CLONE_NEWNET: int # Linux 2.6.24+
|
|
CLONE_NEWNS: int
|
|
CLONE_NEWPID: int # Linux 3.8+
|
|
CLONE_NEWTIME: int # Linux 5.6+
|
|
CLONE_NEWUSER: int # Linux 3.8+
|
|
CLONE_NEWUTS: int # Linux 2.6.19+
|
|
CLONE_SIGHAND: int
|
|
CLONE_SYSVSEM: int # Linux 2.6.26+
|
|
CLONE_THREAD: int
|
|
CLONE_VM: int
|
|
def unshare(flags: int) -> None: ...
|
|
def setns(fd: FileDescriptorLike, nstype: int = 0) -> None: ...
|
|
|
|
if sys.version_info >= (3, 13) and sys.platform != "win32":
|
|
def posix_openpt(oflag: int, /) -> int: ...
|
|
def grantpt(fd: FileDescriptorLike, /) -> None: ...
|
|
def unlockpt(fd: FileDescriptorLike, /) -> None: ...
|
|
def ptsname(fd: FileDescriptorLike, /) -> str: ...
|
|
|
|
if sys.version_info >= (3, 13) and sys.platform == "linux":
|
|
TFD_TIMER_ABSTIME: Final = 1
|
|
TFD_TIMER_CANCEL_ON_SET: Final = 2
|
|
TFD_NONBLOCK: Final[int]
|
|
TFD_CLOEXEC: Final[int]
|
|
POSIX_SPAWN_CLOSEFROM: Final[int]
|
|
|
|
def timerfd_create(clockid: int, /, *, flags: int = 0) -> int: ...
|
|
def timerfd_settime(fd: FileDescriptor, /, *, flags: int = 0, initial: float = 0.0, interval: float = 0.0) -> tuple[float, float]: ...
|
|
def timerfd_settime_ns(fd: FileDescriptor, /, *, flags: int = 0, initial: int = 0, interval: int = 0) -> tuple[int, int]: ...
|
|
def timerfd_gettime(fd: FileDescriptor, /) -> tuple[float, float]: ...
|
|
def timerfd_gettime_ns(fd: FileDescriptor, /) -> tuple[int, int]: ...
|
|
|
|
if sys.version_info >= (3, 13) or sys.platform != "win32":
|
|
# Added to Windows in 3.13.
|
|
def fchmod(fd: int, mode: int) -> None: ...
|
|
|
|
if sys.platform != "linux":
|
|
if sys.version_info >= (3, 13) or sys.platform != "win32":
|
|
# Added to Windows in 3.13.
|
|
def lchmod(path: StrOrBytesPath, mode: int) -> None: ...
|
|
|
|
@overload
|
|
def ilistdir(dir: Union[str, bytes]) -> Iterator[Union[Tuple[str, int, int], Tuple[str, int, int, int]]]:
|
|
"""
|
|
This function returns an iterator which then yields tuples corresponding to
|
|
the entries in the directory that it is listing. With no argument it lists the
|
|
current directory, otherwise it lists the directory given by *dir*.
|
|
|
|
The tuples have the form *(name, type, inode[, size])*:
|
|
|
|
- *name* is a string (or bytes if *dir* is a bytes object) and is the name of
|
|
the entry;
|
|
- *type* is an integer that specifies the type of the entry, with 0x4000 for
|
|
directories and 0x8000 for regular files;
|
|
- *inode* is an integer corresponding to the inode of the file, and may be 0
|
|
for filesystems that don't have such a notion.
|
|
- Some platforms may return a 4-tuple that includes the entry's *size*. For
|
|
file entries, *size* is an integer representing the size of the file
|
|
or -1 if unknown. Its meaning is currently undefined for directory
|
|
entries.
|
|
"""
|
|
...
|
|
|
|
@overload
|
|
def ilistdir() -> Iterator[Union[Tuple[str, int, int], Tuple[str, int, int, int]]]: ...
|
|
@overload
|
|
def ilistdir(dir: Union[str, bytes]) -> Iterator[Union[Tuple[str, int, int], Tuple[str, int, int, int]]]:
|
|
"""
|
|
This function returns an iterator which then yields tuples corresponding to
|
|
the entries in the directory that it is listing. With no argument it lists the
|
|
current directory, otherwise it lists the directory given by *dir*.
|
|
|
|
The tuples have the form *(name, type, inode[, size])*:
|
|
|
|
- *name* is a string (or bytes if *dir* is a bytes object) and is the name of
|
|
the entry;
|
|
- *type* is an integer that specifies the type of the entry, with 0x4000 for
|
|
directories and 0x8000 for regular files;
|
|
- *inode* is an integer corresponding to the inode of the file, and may be 0
|
|
for filesystems that don't have such a notion.
|
|
- Some platforms may return a 4-tuple that includes the entry's *size*. For
|
|
file entries, *size* is an integer representing the size of the file
|
|
or -1 if unknown. Its meaning is currently undefined for directory
|
|
entries.
|
|
"""
|
|
...
|
|
|
|
@overload
|
|
def ilistdir() -> Iterator[Union[Tuple[str, int, int], Tuple[str, int, int, int]]]: ...
|
|
@overload
|
|
def ilistdir(dir: Union[str, bytes]) -> Iterator[Union[Tuple[str, int, int], Tuple[str, int, int, int]]]:
|
|
"""
|
|
This function returns an iterator which then yields tuples corresponding to
|
|
the entries in the directory that it is listing. With no argument it lists the
|
|
current directory, otherwise it lists the directory given by *dir*.
|
|
|
|
The tuples have the form *(name, type, inode[, size])*:
|
|
|
|
- *name* is a string (or bytes if *dir* is a bytes object) and is the name of
|
|
the entry;
|
|
- *type* is an integer that specifies the type of the entry, with 0x4000 for
|
|
directories and 0x8000 for regular files;
|
|
- *inode* is an integer corresponding to the inode of the file, and may be 0
|
|
for filesystems that don't have such a notion.
|
|
- Some platforms may return a 4-tuple that includes the entry's *size*. For
|
|
file entries, *size* is an integer representing the size of the file
|
|
or -1 if unknown. Its meaning is currently undefined for directory
|
|
entries.
|
|
"""
|
|
...
|
|
|
|
@overload
|
|
def ilistdir() -> Iterator[Union[Tuple[str, int, int], Tuple[str, int, int, int]]]: ...
|
|
@overload
|
|
def ilistdir(dir: Union[str, bytes]) -> Iterator[Union[Tuple[str, int, int], Tuple[str, int, int, int]]]:
|
|
"""
|
|
This function returns an iterator which then yields tuples corresponding to
|
|
the entries in the directory that it is listing. With no argument it lists the
|
|
current directory, otherwise it lists the directory given by *dir*.
|
|
|
|
The tuples have the form *(name, type, inode[, size])*:
|
|
|
|
- *name* is a string (or bytes if *dir* is a bytes object) and is the name of
|
|
the entry;
|
|
- *type* is an integer that specifies the type of the entry, with 0x4000 for
|
|
directories and 0x8000 for regular files;
|
|
- *inode* is an integer corresponding to the inode of the file, and may be 0
|
|
for filesystems that don't have such a notion.
|
|
- Some platforms may return a 4-tuple that includes the entry's *size*. For
|
|
file entries, *size* is an integer representing the size of the file
|
|
or -1 if unknown. Its meaning is currently undefined for directory
|
|
entries.
|
|
"""
|
|
...
|
|
|
|
@overload
|
|
def ilistdir() -> Iterator[Union[Tuple[str, int, int], Tuple[str, int, int, int]]]: ...
|
|
@overload
|
|
def ilistdir(dir: Union[str, bytes]) -> Iterator[Union[Tuple[str, int, int], Tuple[str, int, int, int]]]:
|
|
"""
|
|
This function returns an iterator which then yields tuples corresponding to
|
|
the entries in the directory that it is listing. With no argument it lists the
|
|
current directory, otherwise it lists the directory given by *dir*.
|
|
|
|
The tuples have the form *(name, type, inode[, size])*:
|
|
|
|
- *name* is a string (or bytes if *dir* is a bytes object) and is the name of
|
|
the entry;
|
|
- *type* is an integer that specifies the type of the entry, with 0x4000 for
|
|
directories and 0x8000 for regular files;
|
|
- *inode* is an integer corresponding to the inode of the file, and may be 0
|
|
for filesystems that don't have such a notion.
|
|
- Some platforms may return a 4-tuple that includes the entry's *size*. For
|
|
file entries, *size* is an integer representing the size of the file
|
|
or -1 if unknown. Its meaning is currently undefined for directory
|
|
entries.
|
|
"""
|
|
...
|
|
|
|
@overload
|
|
def ilistdir() -> Iterator[Union[Tuple[str, int, int], Tuple[str, int, int, int]]]: ...
|
|
@overload
|
|
def ilistdir(dir: Union[str, bytes]) -> Iterator[Union[Tuple[str, int, int], Tuple[str, int, int, int]]]:
|
|
"""
|
|
This function returns an iterator which then yields tuples corresponding to
|
|
the entries in the directory that it is listing. With no argument it lists the
|
|
current directory, otherwise it lists the directory given by *dir*.
|
|
|
|
The tuples have the form *(name, type, inode[, size])*:
|
|
|
|
- *name* is a string (or bytes if *dir* is a bytes object) and is the name of
|
|
the entry;
|
|
- *type* is an integer that specifies the type of the entry, with 0x4000 for
|
|
directories and 0x8000 for regular files;
|
|
- *inode* is an integer corresponding to the inode of the file, and may be 0
|
|
for filesystems that don't have such a notion.
|
|
- Some platforms may return a 4-tuple that includes the entry's *size*. For
|
|
file entries, *size* is an integer representing the size of the file
|
|
or -1 if unknown. Its meaning is currently undefined for directory
|
|
entries.
|
|
"""
|
|
...
|
|
|
|
@overload
|
|
def ilistdir() -> Iterator[Union[Tuple[str, int, int], Tuple[str, int, int, int]]]: ...
|
|
@overload
|
|
def ilistdir(dir: Union[str, bytes]) -> Iterator[Union[Tuple[str, int, int], Tuple[str, int, int, int]]]:
|
|
"""
|
|
This function returns an iterator which then yields tuples corresponding to
|
|
the entries in the directory that it is listing. With no argument it lists the
|
|
current directory, otherwise it lists the directory given by *dir*.
|
|
|
|
The tuples have the form *(name, type, inode[, size])*:
|
|
|
|
- *name* is a string (or bytes if *dir* is a bytes object) and is the name of
|
|
the entry;
|
|
- *type* is an integer that specifies the type of the entry, with 0x4000 for
|
|
directories and 0x8000 for regular files;
|
|
- *inode* is an integer corresponding to the inode of the file, and may be 0
|
|
for filesystems that don't have such a notion.
|
|
- Some platforms may return a 4-tuple that includes the entry's *size*. For
|
|
file entries, *size* is an integer representing the size of the file
|
|
or -1 if unknown. Its meaning is currently undefined for directory
|
|
entries.
|
|
"""
|
|
...
|
|
|
|
@overload
|
|
def ilistdir() -> Iterator[Union[Tuple[str, int, int], Tuple[str, int, int, int]]]: ...
|
|
@mp_available() # force merge
|
|
def dupterm(stream_object, index=0, /) -> IO:
|
|
"""
|
|
Duplicate or switch the MicroPython terminal (the REPL) on the given `stream`-like
|
|
object. The *stream_object* argument must be a native stream object, or derive
|
|
from ``io.IOBase`` and implement the ``readinto()`` and
|
|
``write()`` methods. The stream should be in non-blocking mode and
|
|
``readinto()`` should return ``None`` if there is no data available for reading.
|
|
|
|
After calling this function all terminal output is repeated on this stream,
|
|
and any input that is available on the stream is passed on to the terminal input.
|
|
|
|
The *index* parameter should be a non-negative integer and specifies which
|
|
duplication slot is set. A given port may implement more than one slot (slot 0
|
|
will always be available) and in that case terminal input and output is
|
|
duplicated on all the slots that are set.
|
|
|
|
If ``None`` is passed as the *stream_object* then duplication is cancelled on
|
|
the slot given by *index*.
|
|
|
|
The function returns the previous stream-like object in the given slot.
|
|
"""
|
|
...
|
|
|
|
# Deprecated functions and classes
|
|
# The following functions and classes have been moved to the vfs module.
|
|
|
|
@mp_available() # force merge
|
|
@deprecated("The `mount` function is deprecated, use `vfs.mount` instead.")
|
|
def mount(fsobj, mount_point, *, readonly=False) -> Incomplete:
|
|
"""
|
|
See `vfs.mount`.
|
|
"""
|
|
...
|
|
|
|
@mp_available() # force merge
|
|
@deprecated("The `umount` function is deprecated, use `vfs.umount` instead.")
|
|
def umount(mount_point) -> Incomplete:
|
|
"""
|
|
See `vfs.umount`.
|
|
"""
|
|
...
|
|
|
|
@mp_available() # force merge
|
|
def dupterm_notify(obj_in: Any, /) -> None:
|
|
# https://github.com/orgs/micropython/discussions/16680
|
|
# https://github.com/micropython/micropython/issues/17799
|
|
"""
|
|
Notify the MicroPython REPL that input is available on a stream-like object
|
|
previously registered via `os.dupterm()`.
|
|
|
|
This function should be called by custom stream implementations (e.g., UART,
|
|
Bluetooth, or other non-USB REPL streams) to inform the REPL that input is
|
|
ready to be read. Proper use ensures that special characters such as
|
|
Ctrl+C (used to trigger KeyboardInterrupt) are processed promptly by the
|
|
REPL, enabling expected interruption behavior for user code.
|
|
|
|
Args:
|
|
obj_in: Is ignored by dupterm_notify, but is required to allow calling
|
|
dupterm_notify from an interrupt handler such as UART.irq()
|
|
Note:
|
|
- If input is available (including control characters like Ctrl+C),
|
|
call this function to ensure responsive REPL behavior.
|
|
- If omitted, input from the custom stream may not be detected or
|
|
processed until the next REPL poll, potentially delaying KeyboardInterrupts
|
|
or other control signals.
|
|
- This is especially important for UART, Bluetooth, or other
|
|
non-standard REPL connections, where automatic notification is not guaranteed.
|
|
|
|
Example:
|
|
from machine import UART
|
|
import os
|
|
uart = UART(0)
|
|
uart.irq(os.dupterm_notify, machine.UART.IRQ_RX) # or UART.IRQ_RXIDLE
|
|
os.dupterm(uart, 0)
|
|
"""
|
|
...
|