Skip to content

系统有关模块

sys 模块

sys模块是与 python 解释器交互的一个接口

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解释器堆栈的最大深度设置

试图错误退出

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模块是与操作系统交互的一个接口

属性

python
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  # 获取环境变量

方法

python
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.systemos.spawnos.popenpopen2

函数描述
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()。

模块方法说明

  1. 在 Python 3.5 之后的版本中,官方文档中提倡通过subprocess.run()函数替代其他函数来使用 subproccess 模块的功能;
  2. 在 Python 3.5 之前的版本中,我们可以通过subprocess.call()subprocess.getoutput()等上面列出的其他函数来使用 subprocess 模块的功能;
  3. subprocess.run()subprocess.call()subprocess.check_call()subprocess.check_output()都是通过对subprocess.Popen的封装来实现的高级函数,因此如果我们需要更复杂功能时,可以通过subprocess.Popen来完成。
  4. subprocess.getoutput()subprocess.getstatusoutput()函数是来自 Python 2.x 的 commands 模块的两个遗留函数。它们隐式的调用系统 shell,并且不保证其他函数所具有的安全性和异常处理的一致性。另外,它们从 Python 3.3.4 开始才支持 Windows 平台。

subprocess 模块目的是启动一个新的进程并与之通信,最常用是定义类Popen
使用Popen可以创建进程,并与进程进行复杂的交互。

python
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:

shell
>>> 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()方法来等返回结果,否则不会阻塞。

设定一小时后关机

python
s = subprocess.Popen("shutdown -s -t 3600", shell=True)
s.wait()  # 阻塞进程等待shell命令执行完毕

子进程:【拒绝访问。(5)】的推荐解决办法

运行 gpedit.msc:计算机配置—–>windows 设置—–>安全设置—–>本地策略—–>安全选项—–>用户帐户控制:用于内置管理员帐户的管理员批准模式—–>禁用

家庭版:【找不到 gpedit.msc】的推荐解决办法

使用 DISM 命令:部署映像服务和管理工具,win10 家庭版批处理如下:

bash
@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

对象之间可以使用斜杠 / 操作符创建子路径

python
import pathlib

p1 = pathlib.PurePosixPath("/etc", "httpd")
p2 = pathlib.PurePosixPath("conf", "httpd.conf")
p1 / p2
# PurePosixPath('/etc/httpd/conf/httpd.conf')

对象.parts 属性可以访问路径的多个组件

python
p = pathlib.PureWindowsPath("c:/Program Files/PSF")
p.parts
# ('c:\\', 'Program Files', 'PSF')

纯路径

不实际访问文件系统的路径处理操作

  • pathlib.PurePath(*)
  • pathlib.PurePosixPath(*)
  • pathlib.PureWindowsPath(*)

同风格可以比较可以排序

对象可以被 os 模块中的方法所接受( os.PathLike 接口实现)

python
import os

p = pathlib.PurePath("/etc")
os.fspath(p)
# '/etc'

不同风格的对象的__str__的斜杠风格不同

具体路径

是纯路径的子类。除了后者提供的操作之外,它们还提供了对路径对象进行系统调用的方法。

  • pathlib.Path(*)
  • pathlib.PosixPath(*)
  • pathlib.WindowsPath(*)
python
pathlib.Path(__file__).parent  # 当前脚本目录路径
pathlib.Path.cwd()  # 当前工作目录路径
pathlib.Path.resolve(PathLike)  # 绝对路径
pathlib.Path.stat(PathLike)  # 获取文件/目录信息

脚本所在目录问题

如果 py 文件使用右键打开方式选择解释器运行会导致 cwd 定位到 C:\Windows\System32
应该在 cmd 中使用命令或者选定为默认打开方式双击

与 OS 模块映射

os 模块方法与 pathlib.path 方法的映射

常用的:

python
##文件名简易合法化
file_name = "".join(s for s in "文_件/名.csv" if s.isalnum())
##文件是否已经存在
from pathlib import Path

if Path("./").joinpath(file_name).is_file():
    pass
python
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)
python
##获取当前所在目录绝对路径
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__

python
##获取所在目录里的子文件名(非目录)
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)
python
##所在目录的所有psd和sai2工程子文件名
import re

list(filter(lambda name: bool(re.findall(r"(^.*\.sai2$)|(^.*\.psd$)", name)), ls))