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 与操作系统交互的核心接口,它提供了:
- 跨平台抽象:统一不同操作系统的API
- 底层访问:直接调用系统调用
- 资源管理:进程、文件、内存等系统资源管理
- 系统信息:获取和操作系统相关的各种信息
关键要点:
os.path只是os模块的一个子模块,专门处理路径os模块的许多函数在不同平台上行为可能不同- 对于高级文件操作,通常使用内置的
open()函数 - 对于进程管理,现代Python更推荐使用
subprocess模块 - 注意权限问题,很多
os函数需要相应的系统权限