系统有关模块
sys 模块
sys
模块是与 python 解释器交互的一个接口
sys.argv # 命令行参数List,第一个元素是程序本身路径
sys.exit(n) # 退出程序,正常退出时exit(0),错误退出sys.exit(1)
sys.version # 获取Python解释程序的版本信息
sys.path # 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform # 返回操作系统平台名称
sys.setrecursionlimit(limit=1000) # Python解释器堆栈的最大深度设置
试图错误退出
import sys
try:
sys.exit(1)
except SystemExit as e:
print(e)
输出
print('hello')
的本质是sys.stdout.write('hello'+'\n')
sys.stdout.flush()
将缓冲区的内容强制打印
在控制台打印字符进度条使用sys.stdout.flush()
会更加平滑
Windows 系统的回车符'\r'
可以重写本行的内容,完成进度条的效果。
打印异常则是sys.stderr
需要输出控制台颜色控制符,需要先使用os.system("")
os 模块
os
模块是与操作系统交互的一个接口
属性
os.sep # 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep # 输出当前平台使用的行终止符,win下为"\r\n",Linux下为"\n"
os.pathsep # 输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name # 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.curdir # 返回当前目录:"."
os.pardir # 获取当前目录的父目录字符串名:".."
os.path # 获取环境变量
方法
os.getcwd() # 获取工作目录 即当前python脚本工作的目录路径
os.chdir("dirname") # 改版当前脚本工作目录 相当于cd
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") # 获取文件/目录信息
"""
st_mode: inode 保护模式
st_ino: inode 节点号。
st_dev: inode 驻留的设备。
st_nlink: inode 的链接数。
st_uid: 所有者的用户ID。
st_gid: 所有者的组ID。
st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。
st_atime: 上次访问的时间。
st_mtime: 最后一次修改的时间。
st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,
在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。
"""
os.system("bash command") # 运行shell命令,直接显示
os.popen("bash command").read() # 运行shell命令,获取执行结果
os.getpid() # 获取当前进程PID
os.getppid() # 获取父进程PID
os.chdir("dirname") # 改变当前脚本工作目录;相当于shell下cd
os.path.abspath(path) # 返回path规范化的绝对路径
os.path.split(path) # 将path分割成目录和文件名二元组返回
os.path.dirname(path) # 返回path的目录。其实就是os.path.split(path)[0]
os.path.basename(path) # 返回path最后的文件名。即os.path.split(path)[1]
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, path3
) # 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path) # 返回path所指向的文件或者目录的最后访问时间
os.path.getmtime(path) # 返回path所指向的文件或者目录的最后修改时间
os.path.getsize(path) # 返回path的大小 文件夹固定4096不准确
关于__file__
的使用
不要直接使用__file__
,因为它在 shell、IDLE、Pycharm 中的表示形式各不相同。
可以以os.path.abspath(__file__)
/ pathlib.Path(__file__)
的方式来使用
很多时候,特别是 GUI 程序,os.popen
函数不推荐使用,而推荐使用 subprocess 模块的popen
subprocess 模块
subprocess 模块是在 python2.4 版本中新增的,官方文档中描述为可以用来替换以下函数:
os.system
、os.spawn
、os.popen
、popen2
函数 | 描述 |
---|---|
subprocess.run() | Python 3.5 中新增的函数。执行指定的命令,等待命令执行完成后返回一个包含执行结果的 CompletedProcess 类的实例。 |
subprocess.call() | 执行指定的命令,返回命令执行状态,其功能类似于 os.system(cmd)。 |
subprocess.check_call() | Python 2.5 中新增的函数。 执行指定的命令,如果执行成功则返回状态码,否则抛出异常。其功能等价于 subprocess.run(..., check=True)。 |
subprocess.check_output() | Python 2.7 中新增的的函数。执行指定的命令,如果执行状态码为 0 则返回命令执行结果,否则抛出异常。 |
subprocess.getoutput(cmd) | 接收字符串格式的命令,执行命令并返回执行结果,其功能类似于 os.popen(cmd).read()和 commands.getoutput(cmd)。 |
subprocess.getstatusoutput(cmd) | 执行 cmd 命令,返回一个元组(命令执行状态, 命令执行结果输出),其功能类似于 commands.getstatusoutput()。 |
模块方法说明
- 在 Python 3.5 之后的版本中,官方文档中提倡通过
subprocess.run()
函数替代其他函数来使用 subproccess 模块的功能; - 在 Python 3.5 之前的版本中,我们可以通过
subprocess.call()
,subprocess.getoutput()
等上面列出的其他函数来使用 subprocess 模块的功能; subprocess.run()
、subprocess.call()
、subprocess.check_call()
和subprocess.check_output()
都是通过对subprocess.Popen
的封装来实现的高级函数,因此如果我们需要更复杂功能时,可以通过subprocess.Popen
来完成。subprocess.getoutput()
和subprocess.getstatusoutput()
函数是来自 Python 2.x 的 commands 模块的两个遗留函数。它们隐式的调用系统 shell,并且不保证其他函数所具有的安全性和异常处理的一致性。另外,它们从 Python 3.3.4 开始才支持 Windows 平台。
subprocess 模块目的是启动一个新的进程并与之通信,最常用是定义类Popen
,
使用Popen
可以创建进程,并与进程进行复杂的交互。
import subprocess
p = subprocess.Popen("dir", stdout=subprocess.PIPE, shell=True)
print(p.stdout.read())
Popen
类参数说明
- args 要执行的 shell 命令,可以是字符串,也可以是命令各个参数组成的序列。
- bufsize 指定缓存策略,0 不缓冲,1 行缓冲,大于 1 表示缓冲区大小,负数表示系统默认。
- stdin, stdout, stderr 程序标准输入、输出、错误句柄。
- preexec_fn 指定一个将在子进程运行之前被调用的可执行对象,只在 Unix 平台下有效。
- close_fds 除了 0,1 和 2 之外的所有文件描述符 是否在子进程执行之前关闭。
- shell 是否使用 shell 作为要执行的程序,True 时建议 args 参数是一个字符串
- cwd 如果该参数值不是 None,则该函数将会在执行这个子进程之前改变当前工作目录。
- env 用于指定子进程的环境变量,默认从父进程中继承。
- universal_newlines 是否将 stdin,stdout 和 stderr 作为文本流打开
- startupinfo 和 creationflags 这两个参数只在 Windows 下有效,它们将被传递给底层的 CreateProcess()函数,用于设置子进程的一些属性,如主窗口的外观,进程优先级等。
使用 python 调用 cmd 中的 python 打印 helloworld:
>>> obj = subprocess.Popen(["python"],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
>>> out,err = obj.communicate(input='print("helloworld!") \n')
>>> print(out)
helloworld!
>>> print(err)
Popen
类方法说明
方法 | 描述 |
---|---|
Popen.poll() | 用于检查子进程(命令)是否已经执行结束,没结束返回 None,结束后返回状态码。 |
Popen.wait(timeout=None) | 等待子进程结束,并返回状态码;如果在 timeout 指定的秒数之后进程还没有结束,将会抛出一个 TimeoutExpired 异常。 |
Popen.communicate(input=None, timeout=None) | 该方法可用来与进程进行交互,比如发送数据到 stdin,从 stdout 和 stderr 读取数据,直到到达文件末尾。 |
Popen.send_signal(signal) | 发送指定的信号给这个子进程。 |
Popen.terminate() | 停止该子进程。 |
Popen.kill() | 杀死该子进程。 |
其实例化对象可以用.wait()
方法来等返回结果,否则不会阻塞。
设定一小时后关机
s = subprocess.Popen("shutdown -s -t 3600", shell=True)
s.wait() # 阻塞进程等待shell命令执行完毕
子进程:【拒绝访问。(5)】的推荐解决办法
运行 gpedit.msc:计算机配置—–>windows 设置—–>安全设置—–>本地策略—–>安全选项—–>用户帐户控制:用于内置管理员帐户的管理员批准模式—–>禁用
家庭版:【找不到 gpedit.msc】的推荐解决办法
使用 DISM 命令:部署映像服务和管理工具,win10 家庭版批处理如下:
@echo off
pushd "%~dp0"
dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >List.txt
dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientTools-Package~3*.mum >>List.txt
for /f %%i in ('findstr /i . List.txt 2^>nul') do dism /online /norestart /add-package:"C:\Windows\servicing\Packages\%%i"
pause
账户获取管理员权限
家庭版等 Administrator 账户是默认隐藏和关闭的,
不要使用命令net user administrator /active:yes
去开启
应该运行 netplwiz 去修改组(重启)
pathlib 模块
pathlib
--- 面向对象的文件系统路径 其类似于 join
对象之间可以使用斜杠 /
操作符创建子路径
import pathlib
p1 = pathlib.PurePosixPath("/etc", "httpd")
p2 = pathlib.PurePosixPath("conf", "httpd.conf")
p1 / p2
# PurePosixPath('/etc/httpd/conf/httpd.conf')
对象.parts 属性可以访问路径的多个组件
p = pathlib.PureWindowsPath("c:/Program Files/PSF")
p.parts
# ('c:\\', 'Program Files', 'PSF')
纯路径
不实际访问文件系统的路径处理操作
- pathlib.PurePath(*)
- pathlib.PurePosixPath(*)
- pathlib.PureWindowsPath(*)
同风格可以比较可以排序
对象可以被 os 模块中的方法所接受( os.PathLike
接口实现)
import os
p = pathlib.PurePath("/etc")
os.fspath(p)
# '/etc'
不同风格的对象的__str__
的斜杠风格不同
具体路径
是纯路径的子类。除了后者提供的操作之外,它们还提供了对路径对象进行系统调用的方法。
- pathlib.Path(*)
- pathlib.PosixPath(*)
- pathlib.WindowsPath(*)
pathlib.Path(__file__).parent # 当前脚本目录路径
pathlib.Path.cwd() # 当前工作目录路径
pathlib.Path.resolve(PathLike) # 绝对路径
pathlib.Path.stat(PathLike) # 获取文件/目录信息
脚本所在目录问题
如果 py 文件使用右键打开方式选择解释器运行会导致 cwd 定位到 C:\Windows\System32
应该在 cmd 中使用命令或者选定为默认打开方式双击
与 OS 模块映射
常用的:
##文件名简易合法化
file_name = "".join(s for s in "文_件/名.csv" if s.isalnum())
##文件是否已经存在
from pathlib import Path
if Path("./").joinpath(file_name).is_file():
pass
from pathlib import Path
import os
##使用os 安全创建目录应当用try而不是if 错误范例:
if not os.path.exists("./opt"):
os.makedirs("./opt")
##使用Path.mkdir安全创建目录
Path("./opt").mkdir(parents=True, exist_ok=True)
##获取当前所在目录绝对路径
root = pathlib.Path("./").resolve() # Path对象
print(root)
root = pathlib.Path.cwd() # Path对象
print(root)
root = os.getcwd() # 字符串
print(root_s)
"__file__"
和__file__
是当前文件的意思,
Path("__file__").parent
不一定等于Path.cwd()
,这与启动的方式有关,
在 import 的时候两者会有差异 前者是入口文件的__file__
##获取所在目录里的子文件名(非目录)
ls = list(filter(lambda file: not os.path.isdir(file), os.listdir(root_s)))
print(ls)
ls = [p.name for p in root.iterdir() if not p.is_dir()]
print(ls)
##所在目录的所有psd和sai2工程子文件名
import re
list(filter(lambda name: bool(re.findall(r"(^.*\.sai2$)|(^.*\.psd$)", name)), ls))