Python sys模块 os模块、OS.open() | open() | OS._exit() | sys.exit() | exit()
sys模块:负责程序和Python交互。
sys常用方法:===========================
- sys.stdout.write('please:')
val = sys.stdin.readline()[:-1]
- sys.argv() # 命令行参数List,第一个元素是程序本身路径
- sys.modules.keys() # 返回所有已经导入的模块列表
- sys.exc_info() # 获取当前正在处理的异常类,exc_type、exc_value、exc_traceback当前处理的异常详细信息
- sys.exit(n) # 退出程序,正常退出时exit(0)
- sys.hexversion # 获取Python解释程序的版本值,16进制格式如:0x020403F0
- sys.version # 获取Python解释程序的版本信息
- sys.maxint # 最大的Int值
- sys.maxunicode # 最大的Unicode值
- sys.modules # 返回系统导入的模块字段,key是模块名,value是模块
- sys.path # 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
- sys.platform # 返回操作系统平台名称
- sys.stdout # 标准输出
- sys.stdin # 标准输入
- sys.stderr # 错误输出
- sys.exc_clear() # 用来清除当前线程所出现的当前的或最近的错误信息
- sys.exec_prefix # 返回平台独立的python文件安装的位置
- sys.byteorder # 本地字节规则的指示器,big-endian平台的值是'big',little-endian平台的值是'little'
- sys.copyright # 记录python版权相关的东西
- sys.api_version # 解释器的C的API版本
os模块:和系统交互的模块
提供对操作系统进行调用的接口
- os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
- os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
- os.curdir 返回当前目录: ('.')
- os.pardir 获取当前目录的父目录字符串名:('..')
- os.makedirs('dirname1/dirname2') 可生成多层递归目录
- os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
- os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
- os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
- os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
- os.remove() 删除一个文件
- os.rename("oldname","newname") 重命名文件/目录
- os.stat('path/filename') 获取文件/目录信息
- os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
- os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
- os.pathsep 输出用于分割文件路径的字符串
- os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
- os.system("bash command") 运行shell命令,直接显示
- os.environ 获取系统环境变量
- os.path.abspath(path) 返回path规范化的绝对路径
- os.path.split(path) 将path分割成目录和文件名二元组返回
- os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
- os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
- os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
- os.path.isabs(path) 如果path是绝对路径,返回True
- os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
- os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
- os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
- os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
- os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
os.getpid() #返回当前进程pid
os.getppid() #返回当前进程的父进程pid
- import os
- while True:
- cmd = input('请输入要执行的系统命令:').strip()
- res = os.popen(cmd).read()
- print(res)
os.popen输出
- 输入出如下
- 请输入要执行的系统命令:dir
- 驱动器 C 中的卷没有标签。
- 卷的序列号是 1CC3-8410
- C:\Users\Administrator\Desktop\Python3_study\day7 的目录
- 2018/06/18 10:18 <DIR> .
- 2018/06/18 10:18 <DIR> ..
- 2018/06/18 10:18 182 os-popen()学习测试.py
- 2018/06/18 10:14 681 socket_client.py
- 2018/06/18 10:14 1,075 socket_server.py
- 2018/06/17 16:02 43 __init__.py
- 4 个文件 1,981 字节
- 2 个目录 6,857,170,944 可用字节
- 执行/输出
os.fork()理解 派生一个子进程,两个返回值,子进程中返回值0;当前进程中返回子进程的pid(非0值)
子进程和父进程之间的任何变量不共享,互不影响
demo1
- # -*- coding: utf-8 -*-
- import time
- import os
- #创建子进程前声明的变量
- number = 7
- try:
- #fork子进程,返回两个同名变量分别在当前进程和子进程中
- #(变量名:fork_result,在当前进程中被赋值为子进程pid号,在子进程中被赋值为0)
- fork_result = os.fork()
- if fork_result == 0:
- '''到这里时父进程还没结束,子进程的父进程ID没变'''
- print("this is child process, pid:{pid},ppid:{ppid}".format(pid=os.getpid(),ppid=os.getppid()))
- number -=1
- print('子进程中测试变量%d 子进程睡2S'%number)
- time.sleep(2)
- '''到这里父进程已经结束,子进程称为独立进程被系统接管,父进程号变为1'''
- print("this is child process, pid:{pid},ppid:{ppid}".format(pid=os.getpid(),ppid=os.getppid()))
- else:
- print("this is parent process,pid:{pid},ppid:{ppid}".format(pid=os.getpid(),ppid=os.getppid()))
- print('测试变量 %d 父进程睡1S' % number)
- time.sleep(1)
- except OSError as e:
- print("fork 子进程失败")
bash 命令行运行python 结果
- (base) [root@vm192-168-3-2 opt]# python daemon_process2.py
- this is parent process,pid:23107,ppid:7301
- 测试变量 7 父进程睡1S
- this is child process, pid:23108,ppid:23107
- 子进程中测试变量6 子进程睡2S
- (base) [root@vm192-168-3-2 opt]# this is child process, pid:23108,ppid:1
命令行传参启动daemon进程-os.fork()记录pid
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- from app import create_server
- import os,sys
- #启动入口
- if __name__ == "__main__":
- usage = "USAGE:%s start| stop" % __file__
- cmd = sys.argv[1] if sys.argv.__len__() >=2 else sys.exit(usage)
- pidfile = 'manager.pid'
- #命令行参数控制
- if cmd == 'start':
- if os.path.isfile(pidfile):
- print('%s already running' % __file__)
- sys.exit(1)
- elif cmd == 'stop':
- try :
- with open(pidfile,'r') as pidnum:
- os.system('kill %s' % pidnum.read())
- os.remove(pidfile)
- print('kill manager ')
- sys.exit(0)
- except FileNotFoundError :
- print('%s is not running' % __file__)
- sys.exit(1)
- else:
- print(usage)
- #执行程序
- try:
- fork_result = os.fork()
- if fork_result == 0:
- fork_process_pid = os.getpid()
- print('daemon process %s start success, pid is : %s' %( __file__, fork_process_pid))
- server = create_server()
- server.start()
- else:
- f = open(pidfile,'w')
- f.write(str(fork_result))
- f.close()
- except OSError as e:
- print('\033[31;1m daemon process start Failed\033[0m')


- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- from app import create_server
- import os,sys
- #启动入口
- if __name__ == "__main__":
- usage = "USAGE:%s start| stop" % __file__
- cmd = sys.argv[1] if sys.argv.__len__() >=2 else sys.exit(usage)
- pidfile = 'manager.pid'
- #命令行参数控制
- if cmd == 'start':
- if os.path.isfile(pidfile):
- print('%s already running' % __file__)
- sys.exit(1)
- elif cmd == 'stop':
- try :
- with open(pidfile,'r') as pidnum:
- os.system('kill %s' % pidnum.read())
- os.remove(pidfile)
- print('kill manager ')
- sys.exit(0)
- except FileNotFoundError :
- print('%s is not running' % __file__)
- sys.exit(1)
- else:
- print(usage)
- #执行程序
- try:
- fork_result = os.fork()
- if fork_result == 0:
- fork_process_pid = os.getpid()
- print('daemon process %s start success, pid is : %s' %( __file__, fork_process_pid))
- server = create_server()
- server.start()
- else:
- f = open(pidfile,'w')
- f.write(str(fork_result))
- f.close()
- except OSError as e:
- print('\033[31;1m daemon process start Failed\033[0m')
命令行传参启动daemon进程-os.fork()记录pid
关于os.fork()的子进程未和终端脱离时。子进程结束是不返回bash命令提示符的思考:
没发生fork的“当前进程”的父进程是bash,退出就退到bash环境,子进程成了孤儿。打印因为stdout 还是指向已结束的进程的bash终端,但是退出的时候因为父进程已经变成系统进程1 。所以子进程退出的时候bash终端就不会弹出来了?
- #/usr/bin/env python
- import os,sys,signal,time
- fork_resu = os.fork()
- if fork_resu > 0:
- ppid = os.getppid()
- pid = os.getpid()
- print('fork 进程成功! 父进程%s 当前进程:%s 子进程;%s'% (ppid,pid,fork_resu))
- time.sleep(3)
- os._exit(0)
- else:
- pid = os.getpid()
- print('子进程环境中输出,当前pid:',pid)
- print('由于第一行输出的"当前进程"去睡觉,睡完就退出了,下面都是子进程输出的')
- os.chdir('/')
- time.sleep(6)
- print('设置新的会话连接?看pid有没有变吧')
- os.setsid()
- pid = os.getpid()
- print('Now pid is :',pid,'')
- sys.stdout.flush()
- #等待进程信号
- #signal.pause()
- 思考原因测试代码
- (base) [root@vm192-168-3-2 signal_study]# python test7.py
- fork 进程成功! 父进程13291 当前进程:27446 子进程;27447
- 子进程环境中输出,当前pid: 27447
- 由于第一行输出的"当前进程"去睡觉,睡完就退出了,下面都是子进程输出的
- (base) [root@vm192-168-3-2 signal_study]# 设置新的会话连接?看pid有没有变吧
- Now pid is : 27447
- <<<<#注意这里必须是手动敲击回车否则下面的命令提示符不会出来
- (base) [root@vm192-168-3-2 signal_study]#
- 思考原因代码输出


- #/usr/bin/env python
- import os,sys,signal,time
- fork_resu = os.fork()
- if fork_resu > 0:
- ppid = os.getppid()
- pid = os.getpid()
- print('fork 进程成功! 父进程%s 当前进程:%s 子进程;%s'% (ppid,pid,fork_resu))
- time.sleep(3)
- os._exit(0)
- else:
- pid = os.getpid()
- print('子进程环境中输出,当前pid:',pid)
- print('由于第一行输出的"当前进程"去睡觉,睡完就退出了,下面都是子进程输出的')
- os.chdir('/')
- time.sleep(6)
- print('设置新的会话连接?看pid有没有变吧')
- os.setsid()
- pid = os.getpid()
- print('Now pid is :',pid,'')
- sys.stdout.flush()
- #等待进程信号
- #signal.pause()
思考原因测试代码


- (base) [root@vm192-168-3-2 signal_study]# python test7.py
- fork 进程成功! 父进程13291 当前进程:27446 子进程;27447
- 子进程环境中输出,当前pid: 27447
- 由于第一行输出的"当前进程"去睡觉,睡完就退出了,下面都是子进程输出的
- (base) [root@vm192-168-3-2 signal_study]# 设置新的会话连接?看pid有没有变吧
- Now pid is : 27447
- <<<<#注意这里必须是手动敲击回车否则下面的命令提示符不会出来
- (base) [root@vm192-168-3-2 signal_study]#
思考原因代码输出
os 常用方法========================
- os 常用方法
- os.remove(‘path/filename’) # 删除文件
- os.rename(oldname, newname) # 重命名文件
- os.walk() # 生成目录树下的所有文件名
- os.chdir('dirname') # 改变目录
- os.mkdir/makedirs('dirname') # 创建目录/多层目录
- os.rmdir/removedirs('dirname') # 删除目录/多层目录
- os.listdir('dirname') # 列出指定目录的文件
- os.getcwd() # 取得当前工作目录
- os.chmod() # 改变目录权限
- os.path.basename(‘path/filename’) # 去掉目录路径,返回文件名
- os.path.dirname(‘path/filename’) # 去掉文件名,返回目录路径
- os.path.join(path1[,path2[,...]]) # 将分离的各部分组合成一个路径名
- os.path.split('path') # 返回( dirname(), basename())元组
- os.path.splitext() # 返回 (filename, extension) 元组
- os.path.getatime\ctime\mtime # 分别返回最近访问、创建、修改时间
- os.path.getsize() # 返回文件大小
- os.path.exists() # 该路径是否存在
- os.path.isabs() # 是否为绝对路径
- os.path.isdir() # 是否为目录
- os.path.isfile() # 是否为文件
- os常用方法
- '''
- Python——os(一)进程参数
- python的os模块提供了一种使用操作系统相关函数的通用手段,如果只是想读或写文件请移步 open(),向操作路径请查阅 os.path 模块,如果想要读取命令行中所有文件里的所有行请查阅 fileinput 模块;对于创建临时文件和临时路径,请查阅 tempfile 模块,高级文件和路径操作请查阅 shutil 模块。
- 关于这些函数你应该注意的有:
- Python中所有内置的与操作系统相关的模块,其设计的思路都是只要函数提供的功能相同,这些函数就有相同的接口。 例如 os.stat(path) 以相同格式返回 path 的 stat 信息, (刚好源于 POSIX 接口)。
- 针对专门操作系统的扩展在 os 模块中也能使用,只不过这样会导致可移植性的下降。
- 类似 “适用于: Unix” 的注释说明这个函数在 Unix 系统上很常见,并不是指它具体在哪一个操作系统上有效。
- 如果不是专门说明,“适用于: Unix” 的函数都支持 Mac OS X。
- 注: 该模块中的所有函数在遇到无效或者无权访问的文件或路径、操作系统无法接受的参数时时都会抛出 OSError 错误。
- 其他章节
- Python——os(二)文件对象
- exception os.error
- 内建异常 OSError 的一个别名
- os.name
- 已经加载的针对具体操作系统的模块名,以下是Pyhton中已经注册过的名字: 'posix', 'nt', 'os2','ce', 'java', 'riscos'
- 另见:
- sys.platform 粒度更细, os.uname() 给出系统无关的版本信息,
- platform 模块提供了对系统身份的更详细检查 进程参数
- 下面的函数和数据对象提供了对当前进程和用户的信息和操作:
- os.environ
- 一个表示字符环境的 mapping 对象。例如,environ['HOME'] 是你的主目录路径(部分系统支持),等价于 C 中的 getenv("HOME")。
- 这个 mapping 对象在 os 模块第一次被加载的时候就被获取,通常是作为Python启动中处理 site.py 时的一部分。此后对于环境变量的改变不会自动反映在 os.environ 中,除非显式地直接更改 os.environ。
- 如果平台支持 putenv() 函数,该 mapping 可以用于修改环境信息和查询环境信息。putenv() 会在这个 mapping 被修改时自动调用。
- 注
- 直接调用 putenv() 不会改变 os.environ。
- 注
- 在某些平台上,包括 FreeBSD 和 Mac OS X,设置 environ 可能会造成内存泄露。 参考 putenv() 的系统文档。
- 如果没有 putenv() ,一个该 mapping 被修改后的版本可能会被传递给适当的进程创建函数,造成子进程获得一个修改后的环境信息。
- 如果平台支持 unsetenv() 函数,你可以通过删除该 mapping 中的实体来取消对某些环境变量的设置。当一个元素被从 os.environ 中删除,或pop() 或 clear()两个方法中的一个被调用时,unsetenv() 都会被自动调用。
- version 2.6的改变: 调用 os.environ.clear() 和 os.environ.pop() 也会取消对环境变量的设置。
- os.chdir(path) os.fchdir(fd) os.getcwd()
- 这些函数都在 Files and Directories 中描述。
- os.ctermid()
- 返回进程的控制终端的文件名。
- 适用于: Unix.
- os.getegid()
- 返回当前进程的有效组ID,涉及到当前进程所执行文件的 “set id” 位。
- 适用于: Unix.
- os.geteuid()
- 返回当前进程的有效用户ID。
- 适用于: Unix.
- os.getgid()
- 返回当前进程的真实组ID。
- 适用于: Unix.
- os.getgroups()
- 返回由当前进程相关的补充组ID构成的列表。
- 适用于: Unix.
- 注
- On Mac OS X, getgroups() behavior differs somewhat from other Unix platforms. If the Python interpreter was built with a deployment target of 10.5 or earlier, getgroups() returns the list of effective group ids associated with the current user process; this list is limited to a system-defined number of entries, typically 16, and may be modified by calls to setgroups() if suitably privileged. If built with a deployment target greater than 10.5, getgroups() returns the current group access list for the user associated with the effective user id of the process; the group access list may change over the lifetime of the process, it is not affected by calls to setgroups(), and its length is not limited to 16. The deployment target value,MACOSX_DEPLOYMENT_TARGET, can be obtained with sysconfig.get_config_var().
- os.initgroups(username, gid)
- 调用系统的 initgroups() 来初始化那些 username 是其成员的组的组访问列表,以及指定组ID对应的组访问列表。
- 适用于: Unix.
- New in version 2.7.
- os.getlogin()
- 返回登录到进程控制终端的用户名,大多数情况下使用环境变量 LOGNAME 来查看用户是谁更为有效,或使用 pwd.getpwuid(os.getuid())[0] 来获得进程真实UID对应的登录名。
- 适用于: Unix.
- os.getpgid(pid)
- 返回参数 pid 指定进程所在的进程组ID,如果 pid 是0, 当前进程所在的进程组ID将被返回。
- 适用于: Unix.
- New in version 2.3.
- os.getpgrp()
- 返回当前进程组的ID。
- 适用于: Unix.
- os.getpid()
- 返回当前进程ID
- 适用于: Unix, Windows.
- os.getppid()
- 返回父进程ID
- 适用于: Unix.
- os.getresuid()
- 返回一个元组—— (ruid, euid, suid) ,分别代表当前进程的真实、有效和保存的(saved)用户ID。
- 适用于: Unix.
- New in version 2.7.
- os.getresgid()
- 返回一个元组—— (rgid, egid, sgid) 分别代表当前进程的真实、有效和保存的(saved)组ID。
- 适用于: Unix.
- New in version 2.7.
- os.getuid()
- 返回当前进程的真实用户ID
- 适用于: Unix.
- os.getenv(varname[, value])
- 如果存在,就返回环境变量 varname 的值;如果不存在,就返回 value , value 缺省为 None。
- 适用于: most flavors of Unix, Windows.
- os.putenv(varname, value)
- 将环境变量 varname 设置为 value。 这样的改变会影响以os.system(), popen() or fork() and execv() 开始的子进程。
- 适用于: most flavors of Unix, Windows.
- 注
- 在某些平台上,包括 FreeBSD 和 Mac OS X,设置 environ 可能会造成内存泄露,请参考具体系统对于 putenv 的文档。
- 当支持 putenv() 时,对 os.environ 中元素的赋值会自动转化为调用 putenv()。但是调用 putenv() 不会更新 os.environ。
- os.setegid(egid)
- 设置当前进程的有效组ID。
- 适用于: Unix.
- os.seteuid(euid)
- 设置当前进程的有效用户ID
- 适用于: Unix.
- os.setgid(gid)
- 设置当前进程的组ID
- 适用于: Unix.
- os.setgroups(groups)
- 将当前进程的补充组ID设置为参数 groups. groups 必须是一个 sequence,每一个元素必须是指示一个组的整数。这个操作通常只有超级用户可以使用。
- 适用于: Unix.
- New in version 2.2.
- 注
- On Mac OS X, the length of groups may not exceed the system-defined maximum number of effective group ids, typically 16. See the documentation for getgroups() for cases where it may not return the same group list set by calling setgroups().
- os.setpgrp()
- 根据不同版本的实现调用系统调用 setpgrp() 或 setpgrp(0, 0)()。具体参考Unix手册
- 适用于: Unix.
- os.setpgid(pid, pgrp)
- 调用系统调用 setpgid() 把进程ID为 pid 的进程的进程组ID设置为参数 pgrp 对应的进程组,关于具体的语义可以参考Unix手册。
- 适用于: Unix.
- os.setregid(rgid, egid)
- 设置当前进程的真实、有效组ID
- 适用于: Unix.
- os.setresgid(rgid, egid, sgid)
- 设置当前进程的真实、有效和保存的组ID
- 适用于: Unix.
- New in version 2.7.
- os.setresuid(ruid, euid, suid)
- 设置当前进程的真实、有效和保存的用户ID
- 适用于: Unix.
- New in version 2.7.
- os.setreuid(ruid, euid)
- 设置当前进程真实和有效用户ID
- 适用于: Unix.
- os.getsid(pid)
- 调用系统调用 getsid(),语义参考Unix手册
- 适用于: Unix.
- New in version 2.4.
- os.setsid()
- 调用系统调用 setsid(),语义参考Unix手册
- 适用于: Unix.
- os.setuid(uid)
- 设置当前进程的用户ID
- 适用于: Unix.
- os.strerror(code)
- 返回错误号为参数 code 的错误消息。在 strerror() 遇到未知的错误号就返回 NULL 的平台上,将会抛出 ValueError 。
- 适用于: Unix, Windows.
- os.umask(mask)
- 设置当前的数值 umask 并返回之前的 umask
- 适用于: Unix, Windows.
- os.uname()
- 返回一个包含当前操作系统信息的5元组——(sysname, nodename,release, version, machine)。有些系统会将 nodename 截断为8个字符,获取主机名称的更好方法是 socket.gethostname() 或 socket.gethostbyaddr(socket.gethostname())。
- 适用于: recent flavors of Unix.
- os.unsetenv(varname)
- 删除 varname 对应的环境变量,该操作会影响通过 os.system()、popen()、fork() 和 execv()启动的子进程。
- 当支持 unsetenv() 时,删除 os.environ 中的元素会自动调用 unsetenv(),然而调用 unsetenv() 不会更新 os.environ。所以更推荐直接删除 os.environ 中的元素。
- 适用于: most flavors of Unix, Windows.
- '''
- os总览
- '''
- 概述
- os.open() 方法用于打开一个文件,并且设置需要的打开选项,模式参数mode参数是可选的,默认为 0777。
- 语法
- open()方法语法格式如下:
- os.open(file, flags[, mode]);
- 参数
- file -- 要打开的文件
- flags -- 该参数可以是以下选项,多个使用 "|" 隔开:
- os.O_RDONLY: 以只读的方式打开
- os.O_WRONLY: 以只写的方式打开
- os.O_RDWR : 以读写的方式打开
- os.O_NONBLOCK: 打开时不阻塞
- os.O_APPEND: 以追加的方式打开
- os.O_CREAT: 创建并打开一个新文件
- os.O_TRUNC: 打开一个文件并截断它的长度为零(必须有写权限)
- os.O_EXCL: 如果指定的文件存在,返回错误
- os.O_SHLOCK: 自动获取共享锁
- os.O_EXLOCK: 自动获取独立锁
- os.O_DIRECT: 消除或减少缓存效果
- os.O_FSYNC : 同步写入
- os.O_NOFOLLOW: 不追踪软链接
- mode -- 类似 chmod()。
- '''
- 返回值
- 返回新打开文件的描述符。
- 实例
- 以下实例演示了 open() 方法的使用:
- #!/usr/bin/python
- # -*- coding: UTF-8 -*-
- import os, sys
- # 打开文件
- fd = os.open( "foo.txt", os.O_RDWR|os.O_CREAT )
- # 写入字符串
- os.write(fd, "This is test")
- # 关闭文件
- os.close( fd )
- print "关闭文件成功!!"
- 执行以上程序输出结果为:
- 关闭文件成功!!
- os.open()参数
- '''
- os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
- os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
- os.curdir 返回当前目录: ('.')
- os.pardir 获取当前目录的父目录字符串名:('..')
- os.makedirs('dirname1/dirname2') 可生成多层递归目录
- os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
- os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
- os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
- os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
- os.remove() 删除一个文件
- os.rename("oldname","newname") 重命名文件/目录
- os.stat('path/filename') 获取文件/目录信息
- os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
- os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
- os.pathsep 输出用于分割文件路径的字符串
- os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
- os.system("bash command") 运行shell命令,直接显示
- os.environ 获取系统环境变量
- os.path.abspath(path) 返回path规范化的绝对路径
- os.path.split(path) 将path分割成目录和文件名二元组返回
- os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
- os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
- os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
- os.path.isabs(path) 如果path是绝对路径,返回True
- os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
- os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
- os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
- os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
- os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
- ################
- '''
- os.system()执行命令,返回只有状态码数字,
- 那么如何python执行系统命令的返回值如何获取呢?哈哈
- 需要一个新的知识:os.popen('命令').read()
- '''
- os补充
- import os
- while True:
- cmd = input('请输入要执行的系统命令:').strip()
- res = os.popen(cmd).read()
- print(res)
- 复制代码
- 请输入要执行的系统命令:dir
- 驱动器 C 中的卷没有标签。
- 卷的序列号是 1CC3-8410
- '''输出
- C:\Users\Administrator\Desktop\Python3_study\day7 的目录
- 2018/06/18 10:18 <DIR> .
- 2018/06/18 10:18 <DIR> ..
- 2018/06/18 10:18 182 os-popen()学习测试.py
- 2018/06/18 10:14 681 socket_client.py
- 2018/06/18 10:14 1,075 socket_server.py
- 2018/06/17 16:02 43 __init__.py
- 4 个文件 1,981 字节
- 2 个目录 6,857,170,944 可用字节
- '''
- os.popen()读取系统命令返回结果


- os 常用方法
- os.remove(‘path/filename’) # 删除文件
- os.rename(oldname, newname) # 重命名文件
- os.walk() # 生成目录树下的所有文件名
- os.chdir('dirname') # 改变目录
- os.mkdir/makedirs('dirname') # 创建目录/多层目录
- os.rmdir/removedirs('dirname') # 删除目录/多层目录
- os.listdir('dirname') # 列出指定目录的文件
- os.getcwd() # 取得当前工作目录
- os.chmod() # 改变目录权限
- os.path.basename(‘path/filename’) # 去掉目录路径,返回文件名
- os.path.dirname(‘path/filename’) # 去掉文件名,返回目录路径
- os.path.join(path1[,path2[,...]]) # 将分离的各部分组合成一个路径名
- os.path.split('path') # 返回( dirname(), basename())元组
- os.path.splitext() # 返回 (filename, extension) 元组
- os.path.getatime\ctime\mtime # 分别返回最近访问、创建、修改时间
- os.path.getsize() # 返回文件大小
- os.path.exists() # 该路径是否存在
- os.path.isabs() # 是否为绝对路径
- os.path.isdir() # 是否为目录
- os.path.isfile() # 是否为文件
os常用方法


- '''
- Python——os(一)进程参数
- python的os模块提供了一种使用操作系统相关函数的通用手段,如果只是想读或写文件请移步 open(),向操作路径请查阅 os.path 模块,如果想要读取命令行中所有文件里的所有行请查阅 fileinput 模块;对于创建临时文件和临时路径,请查阅 tempfile 模块,高级文件和路径操作请查阅 shutil 模块。
- 关于这些函数你应该注意的有:
- Python中所有内置的与操作系统相关的模块,其设计的思路都是只要函数提供的功能相同,这些函数就有相同的接口。 例如 os.stat(path) 以相同格式返回 path 的 stat 信息, (刚好源于 POSIX 接口)。
- 针对专门操作系统的扩展在 os 模块中也能使用,只不过这样会导致可移植性的下降。
- 类似 “适用于: Unix” 的注释说明这个函数在 Unix 系统上很常见,并不是指它具体在哪一个操作系统上有效。
- 如果不是专门说明,“适用于: Unix” 的函数都支持 Mac OS X。
- 注: 该模块中的所有函数在遇到无效或者无权访问的文件或路径、操作系统无法接受的参数时时都会抛出 OSError 错误。
- 其他章节
- Python——os(二)文件对象
- exception os.error
- 内建异常 OSError 的一个别名
- os.name
- 已经加载的针对具体操作系统的模块名,以下是Pyhton中已经注册过的名字: 'posix', 'nt', 'os2','ce', 'java', 'riscos'
- 另见:
- sys.platform 粒度更细, os.uname() 给出系统无关的版本信息,
- platform 模块提供了对系统身份的更详细检查 进程参数
- 下面的函数和数据对象提供了对当前进程和用户的信息和操作:
- os.environ
- 一个表示字符环境的 mapping 对象。例如,environ['HOME'] 是你的主目录路径(部分系统支持),等价于 C 中的 getenv("HOME")。
- 这个 mapping 对象在 os 模块第一次被加载的时候就被获取,通常是作为Python启动中处理 site.py 时的一部分。此后对于环境变量的改变不会自动反映在 os.environ 中,除非显式地直接更改 os.environ。
- 如果平台支持 putenv() 函数,该 mapping 可以用于修改环境信息和查询环境信息。putenv() 会在这个 mapping 被修改时自动调用。
- 注
- 直接调用 putenv() 不会改变 os.environ。
- 注
- 在某些平台上,包括 FreeBSD 和 Mac OS X,设置 environ 可能会造成内存泄露。 参考 putenv() 的系统文档。
- 如果没有 putenv() ,一个该 mapping 被修改后的版本可能会被传递给适当的进程创建函数,造成子进程获得一个修改后的环境信息。
- 如果平台支持 unsetenv() 函数,你可以通过删除该 mapping 中的实体来取消对某些环境变量的设置。当一个元素被从 os.environ 中删除,或pop() 或 clear()两个方法中的一个被调用时,unsetenv() 都会被自动调用。
- version 2.6的改变: 调用 os.environ.clear() 和 os.environ.pop() 也会取消对环境变量的设置。
- os.chdir(path) os.fchdir(fd) os.getcwd()
- 这些函数都在 Files and Directories 中描述。
- os.ctermid()
- 返回进程的控制终端的文件名。
- 适用于: Unix.
- os.getegid()
- 返回当前进程的有效组ID,涉及到当前进程所执行文件的 “set id” 位。
- 适用于: Unix.
- os.geteuid()
- 返回当前进程的有效用户ID。
- 适用于: Unix.
- os.getgid()
- 返回当前进程的真实组ID。
- 适用于: Unix.
- os.getgroups()
- 返回由当前进程相关的补充组ID构成的列表。
- 适用于: Unix.
- 注
- On Mac OS X, getgroups() behavior differs somewhat from other Unix platforms. If the Python interpreter was built with a deployment target of 10.5 or earlier, getgroups() returns the list of effective group ids associated with the current user process; this list is limited to a system-defined number of entries, typically 16, and may be modified by calls to setgroups() if suitably privileged. If built with a deployment target greater than 10.5, getgroups() returns the current group access list for the user associated with the effective user id of the process; the group access list may change over the lifetime of the process, it is not affected by calls to setgroups(), and its length is not limited to 16. The deployment target value,MACOSX_DEPLOYMENT_TARGET, can be obtained with sysconfig.get_config_var().
- os.initgroups(username, gid)
- 调用系统的 initgroups() 来初始化那些 username 是其成员的组的组访问列表,以及指定组ID对应的组访问列表。
- 适用于: Unix.
- New in version 2.7.
- os.getlogin()
- 返回登录到进程控制终端的用户名,大多数情况下使用环境变量 LOGNAME 来查看用户是谁更为有效,或使用 pwd.getpwuid(os.getuid())[0] 来获得进程真实UID对应的登录名。
- 适用于: Unix.
- os.getpgid(pid)
- 返回参数 pid 指定进程所在的进程组ID,如果 pid 是0, 当前进程所在的进程组ID将被返回。
- 适用于: Unix.
- New in version 2.3.
- os.getpgrp()
- 返回当前进程组的ID。
- 适用于: Unix.
- os.getpid()
- 返回当前进程ID
- 适用于: Unix, Windows.
- os.getppid()
- 返回父进程ID
- 适用于: Unix.
- os.getresuid()
- 返回一个元组—— (ruid, euid, suid) ,分别代表当前进程的真实、有效和保存的(saved)用户ID。
- 适用于: Unix.
- New in version 2.7.
- os.getresgid()
- 返回一个元组—— (rgid, egid, sgid) 分别代表当前进程的真实、有效和保存的(saved)组ID。
- 适用于: Unix.
- New in version 2.7.
- os.getuid()
- 返回当前进程的真实用户ID
- 适用于: Unix.
- os.getenv(varname[, value])
- 如果存在,就返回环境变量 varname 的值;如果不存在,就返回 value , value 缺省为 None。
- 适用于: most flavors of Unix, Windows.
- os.putenv(varname, value)
- 将环境变量 varname 设置为 value。 这样的改变会影响以os.system(), popen() or fork() and execv() 开始的子进程。
- 适用于: most flavors of Unix, Windows.
- 注
- 在某些平台上,包括 FreeBSD 和 Mac OS X,设置 environ 可能会造成内存泄露,请参考具体系统对于 putenv 的文档。
- 当支持 putenv() 时,对 os.environ 中元素的赋值会自动转化为调用 putenv()。但是调用 putenv() 不会更新 os.environ。
- os.setegid(egid)
- 设置当前进程的有效组ID。
- 适用于: Unix.
- os.seteuid(euid)
- 设置当前进程的有效用户ID
- 适用于: Unix.
- os.setgid(gid)
- 设置当前进程的组ID
- 适用于: Unix.
- os.setgroups(groups)
- 将当前进程的补充组ID设置为参数 groups. groups 必须是一个 sequence,每一个元素必须是指示一个组的整数。这个操作通常只有超级用户可以使用。
- 适用于: Unix.
- New in version 2.2.
- 注
- On Mac OS X, the length of groups may not exceed the system-defined maximum number of effective group ids, typically 16. See the documentation for getgroups() for cases where it may not return the same group list set by calling setgroups().
- os.setpgrp()
- 根据不同版本的实现调用系统调用 setpgrp() 或 setpgrp(0, 0)()。具体参考Unix手册
- 适用于: Unix.
- os.setpgid(pid, pgrp)
- 调用系统调用 setpgid() 把进程ID为 pid 的进程的进程组ID设置为参数 pgrp 对应的进程组,关于具体的语义可以参考Unix手册。
- 适用于: Unix.
- os.setregid(rgid, egid)
- 设置当前进程的真实、有效组ID
- 适用于: Unix.
- os.setresgid(rgid, egid, sgid)
- 设置当前进程的真实、有效和保存的组ID
- 适用于: Unix.
- New in version 2.7.
- os.setresuid(ruid, euid, suid)
- 设置当前进程的真实、有效和保存的用户ID
- 适用于: Unix.
- New in version 2.7.
- os.setreuid(ruid, euid)
- 设置当前进程真实和有效用户ID
- 适用于: Unix.
- os.getsid(pid)
- 调用系统调用 getsid(),语义参考Unix手册
- 适用于: Unix.
- New in version 2.4.
- os.setsid()
- 调用系统调用 setsid(),语义参考Unix手册
- 适用于: Unix.
- os.setuid(uid)
- 设置当前进程的用户ID
- 适用于: Unix.
- os.strerror(code)
- 返回错误号为参数 code 的错误消息。在 strerror() 遇到未知的错误号就返回 NULL 的平台上,将会抛出 ValueError 。
- 适用于: Unix, Windows.
- os.umask(mask)
- 设置当前的数值 umask 并返回之前的 umask
- 适用于: Unix, Windows.
- os.uname()
- 返回一个包含当前操作系统信息的5元组——(sysname, nodename,release, version, machine)。有些系统会将 nodename 截断为8个字符,获取主机名称的更好方法是 socket.gethostname() 或 socket.gethostbyaddr(socket.gethostname())。
- 适用于: recent flavors of Unix.
- os.unsetenv(varname)
- 删除 varname 对应的环境变量,该操作会影响通过 os.system()、popen()、fork() 和 execv()启动的子进程。
- 当支持 unsetenv() 时,删除 os.environ 中的元素会自动调用 unsetenv(),然而调用 unsetenv() 不会更新 os.environ。所以更推荐直接删除 os.environ 中的元素。
- 适用于: most flavors of Unix, Windows.
- '''
os总览


- '''
- 概述
- os.open() 方法用于打开一个文件,并且设置需要的打开选项,模式参数mode参数是可选的,默认为 0777。
- 语法
- open()方法语法格式如下:
- os.open(file, flags[, mode]);
- 参数
- file -- 要打开的文件
- flags -- 该参数可以是以下选项,多个使用 "|" 隔开:
- os.O_RDONLY: 以只读的方式打开
- os.O_WRONLY: 以只写的方式打开
- os.O_RDWR : 以读写的方式打开
- os.O_NONBLOCK: 打开时不阻塞
- os.O_APPEND: 以追加的方式打开
- os.O_CREAT: 创建并打开一个新文件
- os.O_TRUNC: 打开一个文件并截断它的长度为零(必须有写权限)
- os.O_EXCL: 如果指定的文件存在,返回错误
- os.O_SHLOCK: 自动获取共享锁
- os.O_EXLOCK: 自动获取独立锁
- os.O_DIRECT: 消除或减少缓存效果
- os.O_FSYNC : 同步写入
- os.O_NOFOLLOW: 不追踪软链接
- mode -- 类似 chmod()。
- '''
- 返回值
- 返回新打开文件的描述符。
- 实例
- 以下实例演示了 open() 方法的使用:
- #!/usr/bin/python
- # -*- coding: UTF-8 -*-
- import os, sys
- # 打开文件
- fd = os.open( "foo.txt", os.O_RDWR|os.O_CREAT )
- # 写入字符串
- os.write(fd, "This is test")
- # 关闭文件
- os.close( fd )
- print "关闭文件成功!!"
- 执行以上程序输出结果为:
- 关闭文件成功!!
os.open()参数


- '''
- os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
- os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
- os.curdir 返回当前目录: ('.')
- os.pardir 获取当前目录的父目录字符串名:('..')
- os.makedirs('dirname1/dirname2') 可生成多层递归目录
- os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
- os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
- os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
- os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
- os.remove() 删除一个文件
- os.rename("oldname","newname") 重命名文件/目录
- os.stat('path/filename') 获取文件/目录信息
- os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
- os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
- os.pathsep 输出用于分割文件路径的字符串
- os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
- os.system("bash command") 运行shell命令,直接显示
- os.environ 获取系统环境变量
- os.path.abspath(path) 返回path规范化的绝对路径
- os.path.split(path) 将path分割成目录和文件名二元组返回
- os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
- os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
- os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
- os.path.isabs(path) 如果path是绝对路径,返回True
- os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
- os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
- os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
- os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
- os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
- ################
- '''
- os.system()执行命令,返回只有状态码数字,
- 那么如何python执行系统命令的返回值如何获取呢?哈哈
- 需要一个新的知识:os.popen('命令').read()
- '''
os补充


- import os
- while True:
- cmd = input('请输入要执行的系统命令:').strip()
- res = os.popen(cmd).read()
- print(res)
- 复制代码
- 请输入要执行的系统命令:dir
- 驱动器 C 中的卷没有标签。
- 卷的序列号是 1CC3-8410
- '''输出
- C:\Users\Administrator\Desktop\Python3_study\day7 的目录
- 2018/06/18 10:18 <DIR> .
- 2018/06/18 10:18 <DIR> ..
- 2018/06/18 10:18 182 os-popen()学习测试.py
- 2018/06/18 10:14 681 socket_client.py
- 2018/06/18 10:14 1,075 socket_server.py
- 2018/06/17 16:02 43 __init__.py
- 4 个文件 1,981 字节
- 2 个目录 6,857,170,944 可用字节
- '''
os.popen()读取系统命令返回结果
不常用:os.dup2 ,os.lseek, os.umask ,os.write,os.fsync
- In [1]: import os,sys
- In [2]: for f in sys.stdout, sys.stderr: f.flush()
- #准备文件描述符
- In [3]: so = open('stdout.log','ab+')
- In [4]: se = open('stderr.log','a+')
- #复制文件描述符标准错误描述符更改
- In [6]: os.dup2(se.fileno(), sys.stderr.fileno())
- Out[6]: 2
- #复制文件描述符标准输出描述符更改
- In [7]: os.dup2(so.fileno(),sys.stdout.fileno()) #错误了直接退出。标准错误已经被写入文件。标准输出也写入到了文件
- (base) [root@vm192-168-3-2 fd_study]# ls 查看生成的文件看里面的内容
- foo.txt stderr.log stdout.log
- (base) [root@vm192-168-3-2 fd_study]# cat stdout.log
- Out[7]: 1
- (base) [root@vm192-168-3-2 fd_study]# cat stderr.log
- Warning: Output is not to a terminal (fd=1).
- Traceback (most recent call last):
- File "/root/anaconda3/bin/ipython", line 11, in <module>
- sys.exit(start_ipython())
- File "/root/anaconda3/lib/python3.7/site-packages/IPython/__init__.py", line 125, in start_ipython
- return launch_new_instance(argv=argv, **kwargs)
- File "/root/anaconda3/lib/python3.7/site-packages/traitlets/config/application.py", line 658, in launch_instance
- app.start()
- File "/root/anaconda3/lib/python3.7/site-packages/IPython/terminal/ipapp.py", line 356, in start
- self.shell.mainloop()
- File "/root/anaconda3/lib/python3.7/site-packages/IPython/terminal/interactiveshell.py", line 498, in mainloop
- self.interact()
- File "/root/anaconda3/lib/python3.7/site-packages/IPython/terminal/interactiveshell.py", line 481, in interact
- code = self.prompt_for_code()
- File "/root/anaconda3/lib/python3.7/site-packages/IPython/terminal/interactiveshell.py", line 410, in prompt_for_code
- **self._extra_prompt_options())
- File "/root/anaconda3/lib/python3.7/site-packages/prompt_toolkit/shortcuts/prompt.py", line 738, in prompt
- return run_sync()
- File "/root/anaconda3/lib/python3.7/site-packages/prompt_toolkit/shortcuts/prompt.py", line 727, in run_sync
- return self.app.run(inputhook=self.inputhook, pre_run=pre_run2)
- File "/root/anaconda3/lib/python3.7/site-packages/prompt_toolkit/application/application.py", line 709, in run
- return run()
- File "/root/anaconda3/lib/python3.7/site-packages/prompt_toolkit/application/application.py", line 683, in run
- return f.result()
- File "/root/anaconda3/lib/python3.7/site-packages/prompt_toolkit/eventloop/future.py", line 149, in result
- raise self._exception
- File "/root/anaconda3/lib/python3.7/site-packages/prompt_toolkit/eventloop/coroutine.py", line 90, in step_next
- new_f = coroutine.throw(exc)
- File "/root/anaconda3/lib/python3.7/site-packages/prompt_toolkit/application/application.py", line 658, in _run_async2
- result = yield f
- File "/root/anaconda3/lib/python3.7/site-packages/prompt_toolkit/eventloop/coroutine.py", line 86, in step_next
- new_f = coroutine.send(None)
- File "/root/anaconda3/lib/python3.7/site-packages/prompt_toolkit/application/application.py", line 601, in _run_async
- self._redraw()
- File "/root/anaconda3/lib/python3.7/site-packages/prompt_toolkit/application/application.py", line 444, in _redraw
- self.renderer.render(self, self.layout)
- File "/root/anaconda3/lib/python3.7/site-packages/prompt_toolkit/renderer.py", line 530, in render
- size = output.get_size()
- File "/root/anaconda3/lib/python3.7/site-packages/prompt_toolkit/output/vt100.py", line 429, in get_size
- rows, columns = _get_size(stdout.fileno())
- File "/root/anaconda3/lib/python3.7/site-packages/prompt_toolkit/output/vt100.py", line 370, in _get_size
- fcntl.ioctl(fileno, termios.TIOCGWINSZ, buf)
- OSError: [Errno 25] Inappropriate ioctl for device
- If you suspect this is an IPython bug, please report it at:
- https://github.com/ipython/ipython/issues
- or send an email to the mailing list at ipython-dev@python.org
- You can print a more detailed traceback right now with "%tb", or use "%debug"
- to interactively debug it.
- Extra-detailed tracebacks for bug-reporting purposes can be enabled via:
- %config Application.verbose_crash=True
- (base) [root@vm192-168-3-2 fd_study]#
- os.dup2()将系统输入,系统输出,系统错误 更改指定到具体文件
- In [9]: fd = os.open('foo2.txt',os.O_RDWR|os.O_CREAT)
- In [10]: os.write(fd,b"This is test")
- Out[10]: 12
- In [11]: str = os.read(fd,1000)
- In [12]: print("Read String is :",str)
- Read String is : b''
- In [14]: os.lseek(fd,0,0) #指针移动到起始位置
- Out[14]: 0
- In [15]: str = os.read(fd,1000)
- In [16]: print("Read String is :",str)
- Read String is : b'This is test'
- In [17]: fd2 = 1000
- In [18]: os.dup2(fd,fd2)
- Out[18]: 1000
- In [19]:
- In [19]: str2 = os.read(fd2,100)
- In [20]: print(str2)
- b''
- In [21]: os.lseek(fd2,0,0)
- Out[21]: 0
- In [22]: str2 = os.read(fd2,100)
- In [23]: print(str2)
- b'This is test'
- In [24]: os.write(fd2,b"This is fd2 write")
- Out[24]: 17
- In [25]: os.close(fd2)
- In [26]: os.close(fd)
- In [27]: exit
- (base) [root@vm192-168-3-2 ~]# cat foo2.txt
- This is testThis is fd2 write(base) [root@vm192-168-3-2 ~]#
- #可以确认复制文件描述符是同一个内存地址位置。写入写入了同一个文件。
- #os.dup2 文件描述符的复制-自测理解
- #!/usr/bin/python
- # -*- coding: UTF-8 -*-
- '''
- 概述
- os.dup2() 方法用于将一个文件描述符 fd 复制到另一个 fd2。
- Unix, Windows 上可用。
- 语法
- dup2()方法语法格式如下:
- os.dup2(fd, fd2);
- 参数
- fd -- 要被复制的文件描述符
- fd2 -- 复制的文件描述符
- 返回值
- 没有返回值。
- 实例
- 以下实例演示了 dup2() 方法的使用:
- '''
- import os, sys
- # 打开文件
- fd = os.open( "foo.txt", os.O_RDWR|os.O_CREAT )
- # 写入字符串
- os.write(fd, "This is test")
- # 文件描述符为 1000
- fd2 = 1000
- os.dup2(fd, fd2);
- # 在新的文件描述符上插入数据
- os.lseek(fd2, 0, 0)
- str = os.read(fd2, 100)
- print "读取的字符串是 : ", str
- # 关闭文件
- os.close( fd )
- print "关闭文件成功!!"
- # os.dup2 文件描述符的复制
- '''
- 概述
- os.lseek() 方法用于设置文件描述符 fd 当前位置为 pos, how 方式修改。
- 在Unix,Windows中有效。
- 语法
- lseek()方法语法格式如下:
- os.lseek(fd, pos, how)
- 参数
- fd -- 文件描述符。
- pos -- 这是相对于给定的参数 how 在文件中的位置。。
- how -- 文件内参考位置。SEEK_SET 或者 0 设置从文件开始的计算的pos; SEEK_CUR或者 1 则从当前位置计算; os.SEEK_END或者2则从文件尾部开始。
- 返回值
- 该方法没有返回值。
- 实例
- 以下实例演示了 lseek() 方法的使用:
- '''
- fd = os.open('foo2.txt',os.O_RDWR|os.O_CREAT)
- os.write(fd,b"This is test")
- 12
- str = os.read(fd,1000)
- print("Read String is :",str)
- Read String is : b'' #指针位置在后面,肯定啥都读不到
- os.lseek(fd,0,0) #调整指针到起始位置
- str = os.read(fd,1000) #重新读
- print("Read String is :",str)
- Read String is : b'This is test' #读到了
- # os.lseek 文件内当前指针位置的调整
- '''
- Python os.fsync() 方法
- Python File(文件) 方法 Python OS 文件/目录方法
- 概述
- os.fsync() 方法强制将文件描述符为fd的文件写入硬盘。在Unix, 将调用fsync()函数;在Windows, 调用 _commit()函数。
- 如果你准备操作一个Python文件对象f, 首先f.flush(),然后os.fsync(f.fileno()), 确保与f相关的所有内存都写入了硬盘.在unix,Windows中有效。
- Unix、Windows上可用。
- 语法
- fsync()方法语法格式如下:
- os.fsync(fd)
- 参数
- fd -- 文件的描述符。
- 返回值
- 该方法没有返回值。
- 实例
- 以下实例演示了 fsync() 方法的使用:
- '''
- #######################################
- #!/usr/bin/python
- # -*- coding: UTF-8 -*-
- import os, sys
- # 打开文件
- fd = os.open( "foo.txt", os.O_RDWR|os.O_CREAT )
- # 写入字符串
- os.write(fd, "This is test")
- # 使用 fsync() 方法.
- os.fsync(fd)
- # 读取内容
- os.lseek(fd, 0, 0)
- str = os.read(fd, 100)
- print "读取的字符串为 : ", str
- # 关闭文件
- os.close( fd)
- print "关闭文件成功!!"
- # os.fsync()方法强制将文件描述符为fd的文件写入硬盘。
- '''
- Python File fileno() 方法
- Python File(文件) 方法 Python File(文件) 方法
- 概述
- fileno() 方法返回一个整型的文件描述符(file descriptor FD 整型),可用于底层操作系统的 I/O 操作。
- 语法
- fileno() 方法语法如下:
- fileObject.fileno();
- 参数
- 无
- 返回值
- 返回文件描述符。
- 实例
- 以下实例演示了 fileno() 方法的使用:
- '''
- #!/usr/bin/python
- # -*- coding: UTF-8 -*-
- # 打开文件
- fo = open("runoob.txt", "wb")
- print "文件名为: ", fo.name
- fid = fo.fileno()
- print "文件描述符为: ", fid
- # 关闭文件
- fo.close()
- '''
- 以上实例输出结果为:
- 文件名为: runoob.txt
- 文件描述符为: 3
- '''
- os.fileno()获取文件描述符数字
- '''
- os.write() 方法用于写入字符串到文件描述符 fd 中. 返回实际写入的字符串长度。
- 在Unix中有效。
- 语法
- write()方法语法格式如下:
- os.write(fd, str)
- 参数
- fd -- 文件描述符。
- str -- 写入的字符串。
- 返回值
- 该方法返回写入的实际位数。
- 实例
- 以下实例演示了 write() 方法的使用:
- '''
- #!/usr/bin/python3
- import os, sys
- # 打开文件
- fd = os.open("f1.txt",os.O_RDWR|os.O_CREAT)
- # 写入字符串
- str = "This is runoob.com site"
- ret = os.write(fd,bytes(str, 'UTF-8'))
- # 输入返回值
- print ("写入的位数为: ")
- print (ret)
- print ("写入成功")
- # 关闭文件
- os.close(fd)
- print ("关闭文件成功!!")
- '''
- 执行以上程序输出结果为:
- 写入的位数为:
- 23
- 写入成功
- 关闭文件成功!!
- '''
- os.write()


- In [1]: import os,sys
- In [2]: for f in sys.stdout, sys.stderr: f.flush()
- #准备文件描述符
- In [3]: so = open('stdout.log','ab+')
- In [4]: se = open('stderr.log','a+')
- #复制文件描述符标准错误描述符更改
- In [6]: os.dup2(se.fileno(), sys.stderr.fileno())
- Out[6]: 2
- #复制文件描述符标准输出描述符更改
- In [7]: os.dup2(so.fileno(),sys.stdout.fileno()) #错误了直接退出。标准错误已经被写入文件。标准输出也写入到了文件
- (base) [root@vm192-168-3-2 fd_study]# ls 查看生成的文件看里面的内容
- foo.txt stderr.log stdout.log
- (base) [root@vm192-168-3-2 fd_study]# cat stdout.log
- Out[7]: 1
- (base) [root@vm192-168-3-2 fd_study]# cat stderr.log
- Warning: Output is not to a terminal (fd=1).
- Traceback (most recent call last):
- File "/root/anaconda3/bin/ipython", line 11, in <module>
- sys.exit(start_ipython())
- File "/root/anaconda3/lib/python3.7/site-packages/IPython/__init__.py", line 125, in start_ipython
- return launch_new_instance(argv=argv, **kwargs)
- File "/root/anaconda3/lib/python3.7/site-packages/traitlets/config/application.py", line 658, in launch_instance
- app.start()
- File "/root/anaconda3/lib/python3.7/site-packages/IPython/terminal/ipapp.py", line 356, in start
- self.shell.mainloop()
- File "/root/anaconda3/lib/python3.7/site-packages/IPython/terminal/interactiveshell.py", line 498, in mainloop
- self.interact()
- File "/root/anaconda3/lib/python3.7/site-packages/IPython/terminal/interactiveshell.py", line 481, in interact
- code = self.prompt_for_code()
- File "/root/anaconda3/lib/python3.7/site-packages/IPython/terminal/interactiveshell.py", line 410, in prompt_for_code
- **self._extra_prompt_options())
- File "/root/anaconda3/lib/python3.7/site-packages/prompt_toolkit/shortcuts/prompt.py", line 738, in prompt
- return run_sync()
- File "/root/anaconda3/lib/python3.7/site-packages/prompt_toolkit/shortcuts/prompt.py", line 727, in run_sync
- return self.app.run(inputhook=self.inputhook, pre_run=pre_run2)
- File "/root/anaconda3/lib/python3.7/site-packages/prompt_toolkit/application/application.py", line 709, in run
- return run()
- File "/root/anaconda3/lib/python3.7/site-packages/prompt_toolkit/application/application.py", line 683, in run
- return f.result()
- File "/root/anaconda3/lib/python3.7/site-packages/prompt_toolkit/eventloop/future.py", line 149, in result
- raise self._exception
- File "/root/anaconda3/lib/python3.7/site-packages/prompt_toolkit/eventloop/coroutine.py", line 90, in step_next
- new_f = coroutine.throw(exc)
- File "/root/anaconda3/lib/python3.7/site-packages/prompt_toolkit/application/application.py", line 658, in _run_async2
- result = yield f
- File "/root/anaconda3/lib/python3.7/site-packages/prompt_toolkit/eventloop/coroutine.py", line 86, in step_next
- new_f = coroutine.send(None)
- File "/root/anaconda3/lib/python3.7/site-packages/prompt_toolkit/application/application.py", line 601, in _run_async
- self._redraw()
- File "/root/anaconda3/lib/python3.7/site-packages/prompt_toolkit/application/application.py", line 444, in _redraw
- self.renderer.render(self, self.layout)
- File "/root/anaconda3/lib/python3.7/site-packages/prompt_toolkit/renderer.py", line 530, in render
- size = output.get_size()
- File "/root/anaconda3/lib/python3.7/site-packages/prompt_toolkit/output/vt100.py", line 429, in get_size
- rows, columns = _get_size(stdout.fileno())
- File "/root/anaconda3/lib/python3.7/site-packages/prompt_toolkit/output/vt100.py", line 370, in _get_size
- fcntl.ioctl(fileno, termios.TIOCGWINSZ, buf)
- OSError: [Errno 25] Inappropriate ioctl for device
- If you suspect this is an IPython bug, please report it at:
- https://github.com/ipython/ipython/issues
- or send an email to the mailing list at ipython-dev@python.org
- You can print a more detailed traceback right now with "%tb", or use "%debug"
- to interactively debug it.
- Extra-detailed tracebacks for bug-reporting purposes can be enabled via:
- %config Application.verbose_crash=True
- (base) [root@vm192-168-3-2 fd_study]#
os.dup2()将系统输入,系统输出,系统错误 更改指定到具体文件


- In [9]: fd = os.open('foo2.txt',os.O_RDWR|os.O_CREAT)
- In [10]: os.write(fd,b"This is test")
- Out[10]: 12
- In [11]: str = os.read(fd,1000)
- In [12]: print("Read String is :",str)
- Read String is : b''
- In [14]: os.lseek(fd,0,0) #指针移动到起始位置
- Out[14]: 0
- In [15]: str = os.read(fd,1000)
- In [16]: print("Read String is :",str)
- Read String is : b'This is test'
- In [17]: fd2 = 1000
- In [18]: os.dup2(fd,fd2)
- Out[18]: 1000
- In [19]:
- In [19]: str2 = os.read(fd2,100)
- In [20]: print(str2)
- b''
- In [21]: os.lseek(fd2,0,0)
- Out[21]: 0
- In [22]: str2 = os.read(fd2,100)
- In [23]: print(str2)
- b'This is test'
- In [24]: os.write(fd2,b"This is fd2 write")
- Out[24]: 17
- In [25]: os.close(fd2)
- In [26]: os.close(fd)
- In [27]: exit
- (base) [root@vm192-168-3-2 ~]# cat foo2.txt
- This is testThis is fd2 write(base) [root@vm192-168-3-2 ~]#
- #可以确认复制文件描述符是同一个内存地址位置。写入写入了同一个文件。
os.dup2 文件描述符的复制-自测理解


- #!/usr/bin/python
- # -*- coding: UTF-8 -*-
- '''
- 概述
- os.dup2() 方法用于将一个文件描述符 fd 复制到另一个 fd2。
- Unix, Windows 上可用。
- 语法
- dup2()方法语法格式如下:
- os.dup2(fd, fd2);
- 参数
- fd -- 要被复制的文件描述符
- fd2 -- 复制的文件描述符
- 返回值
- 没有返回值。
- 实例
- 以下实例演示了 dup2() 方法的使用:
- '''
- import os, sys
- # 打开文件
- fd = os.open( "foo.txt", os.O_RDWR|os.O_CREAT )
- # 写入字符串
- os.write(fd, "This is test")
- # 文件描述符为 1000
- fd2 = 1000
- os.dup2(fd, fd2);
- # 在新的文件描述符上插入数据
- os.lseek(fd2, 0, 0)
- str = os.read(fd2, 100)
- print "读取的字符串是 : ", str
- # 关闭文件
- os.close( fd )
- print "关闭文件成功!!"
os.dup2 文件描述符的复制


- '''
- 概述
- os.lseek() 方法用于设置文件描述符 fd 当前位置为 pos, how 方式修改。
- 在Unix,Windows中有效。
- 语法
- lseek()方法语法格式如下:
- os.lseek(fd, pos, how)
- 参数
- fd -- 文件描述符。
- pos -- 这是相对于给定的参数 how 在文件中的位置。。
- how -- 文件内参考位置。SEEK_SET 或者 0 设置从文件开始的计算的pos; SEEK_CUR或者 1 则从当前位置计算; os.SEEK_END或者2则从文件尾部开始。
- 返回值
- 该方法没有返回值。
- 实例
- 以下实例演示了 lseek() 方法的使用:
- '''
- fd = os.open('foo2.txt',os.O_RDWR|os.O_CREAT)
- os.write(fd,b"This is test")
- 12
- str = os.read(fd,1000)
- print("Read String is :",str)
- Read String is : b'' #指针位置在后面,肯定啥都读不到
- os.lseek(fd,0,0) #调整指针到起始位置
- str = os.read(fd,1000) #重新读
- print("Read String is :",str)
- Read String is : b'This is test' #读到了
os.lseek 文件内当前指针位置的调整


- '''
- Python os.fsync() 方法
- Python File(文件) 方法 Python OS 文件/目录方法
- 概述
- os.fsync() 方法强制将文件描述符为fd的文件写入硬盘。在Unix, 将调用fsync()函数;在Windows, 调用 _commit()函数。
- 如果你准备操作一个Python文件对象f, 首先f.flush(),然后os.fsync(f.fileno()), 确保与f相关的所有内存都写入了硬盘.在unix,Windows中有效。
- Unix、Windows上可用。
- 语法
- fsync()方法语法格式如下:
- os.fsync(fd)
- 参数
- fd -- 文件的描述符。
- 返回值
- 该方法没有返回值。
- 实例
- 以下实例演示了 fsync() 方法的使用:
- '''
- #######################################
- #!/usr/bin/python
- # -*- coding: UTF-8 -*-
- import os, sys
- # 打开文件
- fd = os.open( "foo.txt", os.O_RDWR|os.O_CREAT )
- # 写入字符串
- os.write(fd, "This is test")
- # 使用 fsync() 方法.
- os.fsync(fd)
- # 读取内容
- os.lseek(fd, 0, 0)
- str = os.read(fd, 100)
- print "读取的字符串为 : ", str
- # 关闭文件
- os.close( fd)
- print "关闭文件成功!!"
os.fsync()方法强制将文件描述符为fd的文件写入硬盘。


- '''
- Python File fileno() 方法
- Python File(文件) 方法 Python File(文件) 方法
- 概述
- fileno() 方法返回一个整型的文件描述符(file descriptor FD 整型),可用于底层操作系统的 I/O 操作。
- 语法
- fileno() 方法语法如下:
- fileObject.fileno();
- 参数
- 无
- 返回值
- 返回文件描述符。
- 实例
- 以下实例演示了 fileno() 方法的使用:
- '''
- #!/usr/bin/python
- # -*- coding: UTF-8 -*-
- # 打开文件
- fo = open("runoob.txt", "wb")
- print "文件名为: ", fo.name
- fid = fo.fileno()
- print "文件描述符为: ", fid
- # 关闭文件
- fo.close()
- '''
- 以上实例输出结果为:
- 文件名为: runoob.txt
- 文件描述符为: 3
- '''
os.fileno()获取文件描述符数字


- '''
- os.write() 方法用于写入字符串到文件描述符 fd 中. 返回实际写入的字符串长度。
- 在Unix中有效。
- 语法
- write()方法语法格式如下:
- os.write(fd, str)
- 参数
- fd -- 文件描述符。
- str -- 写入的字符串。
- 返回值
- 该方法返回写入的实际位数。
- 实例
- 以下实例演示了 write() 方法的使用:
- '''
- #!/usr/bin/python3
- import os, sys
- # 打开文件
- fd = os.open("f1.txt",os.O_RDWR|os.O_CREAT)
- # 写入字符串
- str = "This is runoob.com site"
- ret = os.write(fd,bytes(str, 'UTF-8'))
- # 输入返回值
- print ("写入的位数为: ")
- print (ret)
- print ("写入成功")
- # 关闭文件
- os.close(fd)
- print ("关闭文件成功!!")
- '''
- 执行以上程序输出结果为:
- 写入的位数为:
- 23
- 写入成功
- 关闭文件成功!!
- '''
os.write()
-----------------------------------------------------------------------------------------------------------------------
对比学习:
OS.open() 和open()的区别
os.open() 打开返回具体的文件描述符数字如 3、4、5、6.....,在使用os.write()的时候必须指定具体的描述符数字,字符串必须是字节类型如:b'test1... ' os.write 只能写入字节类型的字符串。


- import os
- fd = os.open('test.txt',os.O_RDWR)
- print('文件描述符:',fd)
- os.write(fd,b"This is runoob.com site") #必须是字节类型字符串存储方式
- '''
- 输出:
- [root@vm192-168-3-2 fd_study]# python test2.py
- 文件描述符: 3
- '''
- #open打开,os.write()写入,正确写法如下
- f = open("f1.txt",'a+')
- os.write(f.fileno(),b"This is runoob.com site")
os.open()
open()内键函数返回的是一个具体对象,而不是具体的文件描述符数字。文件描述符数字需要用返回的对象调用.fileno()获取。
open()内键函数返回的对象 自带.write()方法,可以根据打开的模式选择不通的写入方式:普通字符串或者字节类型字符串


- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- import os
- fd = os.open("f1.txt",os.O_RDWR|os.O_CREAT)
- f = open('test.txt','ab+') #字节方式打开
- # 写入字符串
- f.write(b'This is runoob.com site') #写入字节类型字符串
- ##############
- f = open('test.txt','a+')
- # 写入普通字符串
- f.write('This is runoob.com site')
open()
----------------------------------------------------------
OS._exit() 和sys.exit() 以及exit()的区别
第一个:sys.exit()


第二个:os._exit()


exit()
第三个:exit()/quit(),这种实际上和sys.exit(n) 没有什么区别
-----------------------------------------------------------------------------------------------------------------------
os.system("系统命令") #调用后立即执行,输出直接到屏幕上,无法保存到一本变量中
os.popen("")可以执行OS系统命令,并将 返回的输出保存为一个内存地址,通过read()读取出来
os.mkdir("")可以创建目录
.pyc文件是干什么的?c代表编译器的意思,实际是第一次运行py文件在内存中的PyCodeObject的对象存储到了pyc文件中。
pyc就是一个“预编译”的一个文件
简述Python的运行过程:先“编译”后解释
Python3中的数据类型
数字:int()整形。
float()浮点数:浮点数
布尔值:1=Ture;0=False
列表[]的取值,增删改查、统计
取值
列表新增数据 .append .insert
列表删除数据
列表改数据、统计重名个数
查询:查询某个数据所在列表变量中的位置
list.index("数据内容")
列表排序、反转、扩展数据
列表复制:
= 、 .copy 方法浅复制 ,copy模块深复制
列表的.copy()方法:浅复制,同 import的copy的copy方法效果相同
列表copy模块的深度复制
列表COPy的三种方式
列表浅COPY的应用(实验环境)
元组
理解为,不可变列表,只有count和index方法
列表购物车小程序:
应用知识说明:
while循环:只要不q退出程序就可以一直购买,哪怕钱不够了,也可以重新选择。
if:做判断余额(工资)是否大于商品价格
for:结合列表的index方法,将所有商品的信息取出来,并且打印出商品在列表中的序号。便于后面进行商品价格查询和比较。以及从工资中扣除商品价格。
-= :做数字运算 从工资中扣除商品价格
append()方法,将已购买的商品加入已购买列表。
Python sys模块 os模块、OS.open() | open() | OS._exit() | sys.exit() | exit()的更多相关文章
- python常用模块(模块和包的解释,time模块,sys模块,random模块,os模块,json和pickle序列化模块)
1.1模块 什么是模块: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文 ...
- Python 五个常用模块资料 os sys time re built-in
1.os模块 os模块包装了不同操作系统的通用接口,使用户在不同操作系统下,可以使用相同的函数接口,返回相同结构的结果. os.name:返回当前操作系统名称('posix', 'nt', ' ...
- Python全栈--7模块--random os sys time datetime hashlib pickle json requests xml
模块分为三种: 自定义模块 内置模块 开源模块 一.安装第三方模块 # python 安装第三方模块 # 加入环境变量 : 右键计算机---属性---高级设置---环境变量---path--分号+py ...
- Python学习笔记——基础篇【第五周】——os模块和sys模块
OS模块 提供对操作系统进行调用的接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录 ...
- 【Python】 sys和os模块
sys sys模块能使程序访问于python解释器联系紧密的变量和函数 ● sys中的一些函数和变量 argv 命令行参数构成的列表 path 查找所有可用模块所在的目录名的列表 platform 查 ...
- python中os模块和sys模块的常见用法
OS模块的常见用法 os.remove() 删除文件 os.rename() 重命名文件 os.walk() 生成目录树下的所有文件名 os.chdir() 改变目录 os.mkd ...
- Python:time模块/random模块/os模块/sys模块
time 模块 #常用方法 1.time.sleep(secs) (线程)推迟指定的时间运行.单位为秒. 2.time.time() 获取当前时间戳 python中时间日期格式化符号: %y 两位数的 ...
- 19 python初学(os 模块,sys 模块,hashlib 模块)
os 模块: # _author: lily # _date: 2019/1/13 import os print(os.getcwd()) # 得到当前的工作目录 # print(os.chdir( ...
- python之常用模块一(time、random、os、sys)
摘要:时间模块time .随机模块random .os模块.sys模块 一.时间模块 三种格式 时间戳时间:浮点数 单位为秒 时间戳起始时间: 1970.1.1 0:0:0 英国伦敦时间 1970.1 ...
- python模块 os&sys&subprocess&hashlib模块
os模块 # os模块可根据带不带path分为两类 # 不带path print(os.getcwd()) # 得到当前工作目录 print(os.name) # 指定你正在使用的操作系统,windo ...
随机推荐
- maven私服-仓库图
- c语言用指针交换两个变量
#include<stdio.h> #include<math.h> int main(){ void swap(int a,int b); void swapPointer( ...
- Linux中gz文件操作遇到的一些技巧和坑
目录 不解压情况下获取gz超大文件的前/后几行? Perl读入gz文件操作? 不能直接通过wc -l 来统计gz文件的行数 前提是gz文件超大,如上百G,肯定不能直接解压来做. 不解压情况下获取gz超 ...
- 【Linux】tmux安装(非root)及其使用
tmux(terminal multiplexer)是Linux上的终端复用神器. 1. 安装 (1)下载 下载及其依赖软件. wget -c https://github.com/tmux/tmux ...
- 详解getchar()函数与缓冲区
1.首先,我们看一下这段代码: 它的简单意思就是从键盘读入一个字符,然后输出到屏幕.理所当然,我们输入1,输出就是1,输入2,输出就是2. 那么我们如果输出的是12呢? 它的输出是1. 这里我们先简单 ...
- 『与善仁』Appium基础 — 19、元素定位工具(三)
目录 1.Chrome Inspect介绍 2.Chrome Inspect打开方式 3.Chrome Inspect工具的使用 (1)Chrome Inspect工作前提 (2)Chrome Ins ...
- A Child's History of England.44
At this period of his reign, when his troubles seemed so few and his prospects so bright, those dome ...
- day03 MySQL数据库之主键与外键
day03 MySQL数据库之主键与外键 昨日内容回顾 针对库的基本SQL语句 # 增 create database meng; # 查 show databases; shwo create da ...
- Hadoop【MR的分区、排序、分组】
[toc] 一.分区 问题:按照条件将结果输出到不同文件中 自定义分区步骤 1.自定义继承Partitioner类,重写getPartition()方法 2.在job驱动Driver中设置自定义的Pa ...
- [php代码审计] 通读审计之shangfancms
前言 大部分的MVC框架,访问的控制器大部分是由外部参数来决定的,那么本篇文章所通读的MVC框架与之前的一系列MVC框架不太一样,它的路由是由程序本身的路由表来决定的. 源码下载 https://ww ...