news 2026/1/27 16:46:17

Python语言之OS模块各部将简单介绍

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python语言之OS模块各部将简单介绍

os模块是 Python 标准库中最强大、功能最丰富的模块之一,除了os.path外,它主要包含以下几大类功能

1.文件和目录操作

importos# 创建和删除目录os.mkdir('new_dir')# 创建单个目录os.makedirs('dir1/dir2/dir3')# 递归创建多级目录os.rmdir('empty_dir')# 删除空目录os.removedirs('a/b/c')# 递归删除空目录# 文件操作os.rename('old.txt','new.txt')# 重命名文件/目录os.remove('file.txt')# 删除文件os.unlink('file.txt')# 删除文件(同remove)# 目录遍历print(os.listdir('.'))# 列出目录内容forroot,dirs,filesinos.walk('.'):# 递归遍历目录树forfileinfiles:print(os.path.join(root,file))# 其他操作os.truncate('file.txt',1024)# 截断文件到指定大小os.sync()# 强制将缓冲区写入磁盘

2.文件描述符和低级文件操作

importos# 使用文件描述符(低级I/O)fd=os.open('test.txt',os.O_RDWR|os.O_CREAT)# 返回文件描述符os.write(fd,b'Hello World\n')os.lseek(fd,0,os.SEEK_SET)# 移动文件指针data=os.read(fd,100)# 读取数据os.close(fd)# 关闭文件描述符# 文件描述符操作os.dup(fd)# 复制文件描述符os.dup2(old_fd,new_fd)# 复制到指定描述符os.pipe()# 创建管道,返回(r, w)两个描述符# 文件锁importfcntl# 需要单独导入fcntl.flock(fd,fcntl.LOCK_EX)# 排他锁

3.进程管理

importos# 进程信息print(f"进程ID:{os.getpid()}")# 当前进程IDprint(f"父进程ID:{os.getppid()}")# 父进程IDprint(f"进程组ID:{os.getpgid(0)}")# 进程组IDprint(f"会话ID:{os.getsid(0)}")# 会话ID# 进程控制pid=os.fork()# 创建子进程(Unix)ifpid==0:print("子进程")os._exit(0)# 退出子进程else:os.waitpid(pid,0)# 等待子进程结束# 执行系统命令exit_code=os.system('ls -la')# 执行shell命令os.execv('/bin/ls',['ls','-la'])# 替换当前进程# 进程信号os.kill(pid,9)# 发送信号给进程os.killpg(pgid,signal.SIGTERM)# 发送信号给进程组

4.环境变量和系统信息

importos# 环境变量操作print(os.environ)# 所有环境变量的字典print(os.getenv('PATH'))# 获取特定环境变量os.environ['MY_VAR']='value'# 设置环境变量(当前进程)os.putenv('MY_VAR','value')# 设置环境变量os.unsetenv('MY_VAR')# 删除环境变量# 系统信息print(f"操作系统:{os.name}")# 操作系统名称(posix, nt, java)print(f"当前用户:{os.getlogin()}")# 登录用户名print(f"CPU数量:{os.cpu_count()}")# CPU核心数print(f"进程优先级:{os.getpriority(os.PRIO_PROCESS,0)}")# 进程优先级

5.用户和权限管理

importosimportpwd# Unix专用importgrp# Unix专用# 用户和组信息(Unix)print(f"当前用户ID:{os.getuid()}")# 用户IDprint(f"当前组ID:{os.getgid()}")# 组IDprint(f"有效用户ID:{os.geteuid()}")# 有效用户IDprint(f"有效组ID:{os.getegid()}")# 有效组ID# 更改权限os.chmod('file.txt',0o755)# 更改文件权限os.chown('file.txt',1000,1000)# 更改文件所有者(Unix)os.lchown('symlink',1000,1000)# 更改符号链接所有者# 切换用户上下文(需要权限)os.setuid(1000)# 设置用户IDos.setgid(1000)# 设置组IDos.initgroups('username',1000)# 初始化组列表

6.终端和输入输出

importosimportsys# 终端操作print(f"终端大小:{os.get_terminal_size()}")# 获取终端尺寸print(f"是否连接终端:{os.isatty(sys.stdout.fileno())}")# 检查是否为终端# 标准输入输出描述符stdin_fd=sys.stdin.fileno()# 标准输入文件描述符(0)stdout_fd=sys.stdout.fileno()# 标准输出文件描述符(1)stderr_fd=sys.stderr.fileno()# 标准错误文件描述符(2)# 重定向# os.dup2(new_fd, stdout_fd) # 重定向标准输出

7.资源管理

importosimportresource# 需要单独导入# 资源限制resource.getrlimit(resource.RLIMIT_CPU)# CPU时间限制resource.getrlimit(resource.RLIMIT_DATA)# 数据段大小限制resource.getrlimit(resource.RLIMIT_STACK)# 栈大小限制resource.getrlimit(resource.RLIMIT_NOFILE)# 文件描述符数量限制# 设置资源限制resource.setrlimit(resource.RLIMIT_NOFILE,(1024,4096))# 获取资源使用情况usage=resource.getrusage(resource.RUSAGE_SELF)print(f"用户CPU时间:{usage.ru_utime}")print(f"系统CPU时间:{usage.ru_stime}")print(f"最大内存使用:{usage.ru_maxrss}")

8.时间和统计信息

importosimporttime# 文件状态信息stat_info=os.stat('file.txt')print(f"文件大小:{stat_info.st_size}字节")print(f"最后修改:{time.ctime(stat_info.st_mtime)}")print(f"最后访问:{time.ctime(stat_info.st_atime)}")print(f"创建时间:{time.ctime(stat_info.st_ctime)}")# Unix: 最后元数据更改# 特殊文件操作os.utime('file.txt',times=None)# 更新访问和修改时间os.makedev(major,minor)# 创建设备号(Unix)os.major(device)# 获取主设备号os.minor(device)# 获取次设备号

9.高级系统调用

importos# 内存映射importmmapwithopen('data.bin','r+b')asf:mm=mmap.mmap(f.fileno(),0)mm[0:100]=b'X'*100mm.close()# 共享内存(Unix)# shm_fd = os.shm_open('/myshm', os.O_CREAT | os.O_RDWR, 0o600)# os.ftruncate(shm_fd, 1024)# 异步I/Oos.posix_fadvise(fd,offset,length,os.POSIX_FADV_WILLNEED)# 预读建议os.sync_file_range(fd,offset,length,os.SYNC_FILE_RANGE_WRITE)# 同步文件范围

10.平台特定功能

importosimportsys# 检查平台ifos.name=='posix':# Unix/Linux/Mac 特定功能importpwdimportgrpelifos.name=='nt':# Windows 特定功能importwinregimportctypes# Windows API 调用ctypes.windll.kernel32.SetConsoleTitleW("My Console")# Windows 特殊路径print(os.startfile('document.pdf'))# 用关联程序打开文件os.system('start explorer .')# 打开资源管理器# 跨平台路径处理(除了os.path)print(os.sep)# 路径分隔符(Unix: /, Windows: \)print(os.altsep)# 替代路径分隔符(Unix: None, Windows: /)print(os.extsep)# 扩展名分隔符(.)print(os.pathsep)# PATH环境变量分隔符(Unix: :, Windows: ;)print(os.defpath)# 默认搜索路径print(os.devnull)# 空设备路径(Unix: /dev/null, Windows: nul)

11.杂项实用功能

importos# 随机数生成random_bytes=os.urandom(16)# 加密安全的随机字节random_number=os.random()# 随机数(已弃用,建议用random模块)# 临时文件和目录importtempfile temp_file=tempfile.NamedTemporaryFile(delete=False)temp_dir=tempfile.mkdtemp()# 工作目录操作current_dir=os.getcwd()# 获取当前工作目录os.chdir('/path/to/dir')# 更改工作目录print(f"绝对路径:{os.path.abspath('.')}")# 特殊常量print(f"行结束符:{repr(os.linesep)}")# 系统行结束符print(f"路径分隔符:{repr(os.sep)}")# 路径分隔符# 系统错误try:os.remove('nonexistent.txt')exceptOSErrorase:print(f"错误号:{e.errno}")print(f"错误信息:{e.strerror}")print(f"文件名:{e.filename}")

12.完整功能分类表

类别主要函数/功能说明
文件操作open(),read(),write(),close()低级文件I/O
目录操作mkdir(),makedirs(),rmdir(),listdir(),walk()目录管理
进程管理fork(),exec(),wait(),kill(),getpid()进程控制
环境变量environ,getenv(),putenv(),unsetenv()环境变量操作
用户权限getuid(),getgid(),chmod(),chown()用户和权限
系统信息name,uname(),cpu_count(),getlogin()系统信息
路径常量sep,altsep,pathsep,linesep平台相关常量
终端操作get_terminal_size(),isatty()终端控制
资源管理resource模块配合系统资源限制
特殊设备devnull,makedev(),major(),minor()设备操作

13.实战示例:创建守护进程

importosimportsysimporttimeimportatexitimportsignaldefdaemonize(pidfile=None):"""将当前进程转换为守护进程"""# 第一次fork,创建子进程,父进程退出try:pid=os.fork()ifpid>0:sys.exit(0)# 退出父进程exceptOSErrorase:sys.stderr.write(f"第一次fork失败:{e}\n")sys.exit(1)# 脱离终端控制os.chdir('/')# 更改工作目录到根os.setsid()# 创建新会话os.umask(0)# 重设文件掩码# 第二次fork,禁止进程重新打开控制终端try:pid=os.fork()ifpid>0:sys.exit(0)exceptOSErrorase:sys.stderr.write(f"第二次fork失败:{e}\n")sys.exit(1)# 重定向标准文件描述符sys.stdout.flush()sys.stderr.flush()# 写入PID文件ifpidfile:withopen(pidfile,'w')asf:f.write(str(os.getpid()))# 注册退出时删除PID文件atexit.register(lambda:os.remove(pidfile))# 守护进程主循环whileTrue:# 这里写守护进程的工作time.sleep(1)if__name__=='__main__':daemonize('/tmp/mydaemon.pid')

敲黑板!!@!

os模块是 Python 与操作系统交互的核心接口,它提供了:

  1. 跨平台抽象:统一不同操作系统的API
  2. 底层访问:直接调用系统调用
  3. 资源管理:进程、文件、内存等系统资源管理
  4. 系统信息:获取和操作系统相关的各种信息

关键要点

  • os.path只是os模块的一个子模块,专门处理路径
  • os模块的许多函数在不同平台上行为可能不同
  • 对于高级文件操作,通常使用内置的open()函数
  • 对于进程管理,现代Python更推荐使用subprocess模块
  • 注意权限问题,很多os函数需要相应的系统权限
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/20 17:27:54

C语言、C++、C#、VB语言对比探究,我们该如何选择?

C语言、C、C#、VB语言对比探究 一、概述 这四种语言代表了编程语言发展的不同阶段和设计哲学: C语言:面向过程的系统级编程语言C:多范式语言,支持面向过程和面向对象C#:完全面向对象的现代编程语言VB:基于.…

作者头像 李华
网站建设 2026/1/19 17:34:00

高性价比云手机 多端同步

云手机是基于端云一体虚拟化技术,将手机的核心计算、存储功能迁移至云端服务器的 “虚拟手机”,它通过在服务器上构建独立手机操作系统实例,用户可通过普通终端远程访问和操控,无需消耗过多本地硬件资源。云手机依托云端的计算和存…

作者头像 李华
网站建设 2026/1/22 4:06:17

GROUP BY进阶用法

问题重新: sql语句中使用了GROUP BY wf_cur.REQUESTID, wf_cur.NODEID,为什么还会出用两行相同REQUESTID的记录呢,GROUP BY不就是拿某个字段来分组吗?GROUP BY 是按你指定的字段组合进行分组的,不是按单个字段。你的例子:sqlGROUP…

作者头像 李华
网站建设 2025/12/29 14:57:37

Xiaomi MiMo-V2-Flash 开源:高效推理、代码与 Agent 基座模型

Xiaomi MiMo-V2-Flash 是小米专为极致推理效率自研的总参数 309B(激活15B)的 MoE 模型,通过引入 Hybrid 注意力架构创新 及 多层 MTP 推理加速,在多个 Agent 测评基准上进入全球开源模型 Top 2;代码能力超过所有开源模…

作者头像 李华
网站建设 2026/1/20 7:31:47

VSCode 配置 C++ 开发环境(Windows+Linux 双平台)

前言作为大二计科生,是不是还在为 C 开发环境配置头疼?Dev-C 功能太简陋,Visual Studio 体积太大,VSCode 凭借轻量、跨平台、插件丰富的优势,成为很多程序员的首选。本文详细讲解 Windows 和 Linux 平台下 VSCode 的 C…

作者头像 李华
网站建设 2026/1/22 10:42:55

自定义Bean Validation注解并自定义校验逻辑

自定义校验注解 实现自定义校验注解,本质上是遵循 JSR-303/JSR-380 (Bean Validation) 规范。 在 Spring Boot 中实现它,只需要 两步走: 定义注解(接口):相当于制定法律条款。定义校验器(实现…

作者头像 李华