本篇内容介绍了“Python类有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
shutil:
shutil.copyfile( src, dst) #从源src复制到dst中去。 如果当前的dst已存在的话就会被覆盖掉
shutil.move( src, dst) #移动文件或重命名
shutil.copymode( src, dst) #只是会复制其权限其他的东西是不会被复制的
shutil.copystat( src, dst) #复制权限、最后访问时间、最后修改时间
shutil.copy( src, dst) #复制一个文件到一个文件或一个目录
shutil.copy2( src, dst) #在copy上的基础上再复制文件最后访问时间与修改时间也复制过来了,类似于cp –p的东西
shutil.copy2( src, dst) #如果两个位置的文件系统是一样的话相当于是rename操作,只是改名;如果是不在相同的文件系统的话就是做move操作
shutil.copytree( olddir, newdir, True/Flase) #把olddir拷贝一份newdir,如果第3个参数是True,则复制目录时将保持文件夹下的符号连接,如果第3个参数是False,则将在复制的目录下生成物理副本来替代符号连接
shutil.rmtree( src ) #递归删除一个目录以及目录内的所有内容
subprocess
subprocess 模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。
使用 subprocess 模块
subprocess 模块首先推荐使用的是它的 run 方法,更高级的用法可以直接使用 Popen 接口。
run 方法语法格式如下:
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None)
args:表示要执行的命令。必须是一个字符串,字符串参数列表。
stdin、stdout 和 stderr:子进程的标准输入、输出和错误。其值可以是 subprocess.PIPE、subprocess.DEVNULL、一个已经存在的文件描述符、已经打开的文件对象或者 None。subprocess.PIPE 表示为子进程创建新的管道。subprocess.DEVNULL 表示使用 os.devnull。默认使用的是 None,表示什么都不做。另外,stderr 可以合并到 stdout 里一起输出。
timeout:设置命令超时时间。如果命令执行时间超时,子进程将被杀死,并弹出 TimeoutExpired 异常。
check:如果该参数设置为 True,并且进程退出状态码不是 0,则弹 出 CalledProcessError 异常。
encoding: 如果指定了该参数,则 stdin、stdout 和 stderr 可以接收字符串数据,并以该编码方式编码。否则只接收 bytes 类型的数据。
shell:如果该参数为 True,将通过操作系统的 shell 执行指定的命令。
run 方法调用方式返回 CompletedProcess 实例,和直接 Popen 差不多,实现是一样的,实际也是调用 Popen,与 Popen 构造函数大致相同,例如:
实例
#执行ls -l /dev/null 命令
>>> subprocess.run(["ls", "-l", "/dev/null"])
crw-rw-rw- 1 root wheel 3, 2 5 4 13:34 /dev/null
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0)
returncode: 执行完子进程状态,通常返回状态为0则表明它已经运行完毕,若值为负值 "-N",表明子进程被终。
简单实例:
实例
import subprocess
def runcmd(command):
ret = subprocess.run(command,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding="utf-8",timeout=1)
if ret.returncode == 0:
print("success:",ret)
else:
print("error:",ret)
runcmd(["dir","/b"])#序列参数
runcmd("exit 1")#字符串参数
输出结果如下:
success: CompletedProcess(args=['dir', '/b'], returncode=0, stdout='test.py/n', stderr='')
error: CompletedProcess(args='exit 1', returncode=1, stdout='', stderr='')
Popen() 方法
Popen 是 subprocess的核心,子进程的创建和管理都靠它处理。
构造函数:
class subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None,
preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=False,
startupinfo=None, creationflags=0,restore_signals=True, start_new_session=False, pass_fds=(),
*, encoding=None, errors=None)
常用参数:
args:shell命令,可以是字符串或者序列类型(如:list,元组)
bufsize:缓冲区大小。当创建标准流的管道对象时使用,默认-1。
0:不使用缓冲区
1:表示行缓冲,仅当universal_newlines=True时可用,也就是文本模式
正数:表示缓冲区大小
负数:表示使用系统默认的缓冲区大小。
stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄
preexec_fn:只在 Unix 平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用
shell:如果该参数为 True,将通过操作系统的 shell 执行指定的命令。
cwd:用于设置子进程的当前目录。
env:用于指定子进程的环境变量。如果 env = None,子进程的环境变量将从父进程中继承。
创建一个子进程,然后执行一个简单的命令:
实例
>>> import subprocess
>>> p = subprocess.Popen('ls -l', shell=True)
>>> total 164
-rw-r–r– 1 root root 133 Jul 4 16:25 admin-openrc.sh
-rw-r–r– 1 root root 268 Jul 10 15:55 admin-openrc-v3.sh
…
>>> p.returncode
>>> p.wait()
0
>>> p.returncode
这里也可以使用 p = subprocess.Popen(['ls', '-cl']) 来创建子进程。
Popen 对象方法
poll(): 检查进程是否终止,如果终止返回 returncode,否则返回 None。
wait(timeout): 等待子进程终止。
communicate(input,timeout): 和子进程交互,发送和读取数据。
send_signal(singnal): 发送信号到子进程 。
terminate(): 停止子进程,也就是发送SIGTERM信号到子进程。
kill(): 杀死子进程。发送 SIGKILL 信号到子进程。
实例
import time
import subprocess
def cmd(command):
subp = subprocess.Popen(command,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding="utf-8")
subp.wait(2)
if subp.poll() == 0:
print(subp.communicate()[1])
else:
print("失败")
cmd("java -version")
cmd("exit 1")
输出结果如下:
java version "1.8.0_31"
Java(TM) SE Runtime Environment (build 1.8.0_31-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode)
失败
信号模块signal
尽管signal是Python中的模块,但主要针对UNIX平台,而Windows内核中由于对信号机制支持不充分,所以在Windows上的Python不能发会信号系统的功能。
Python的signal模块负责程序内部的信号处理,典型的操作包括信号处理函数、暂停并等待信号,定时发出SIGALRM等。
加载模块
import signal
信号名称
# 连接挂断
signal.SIGUP
# 非法指令
signal.SIGILL
# 终止进程
signal.SIGINT
SIGINT信号编号为2,当按下键盘CTRL+c组合键时进程会收到此信号,用于终止进程。
# 暂停进程CTRL+z
signal.SIGSTP
# 杀死进程,此信号不能被捕获或忽略。
signal.SIGKILL
SIGKILL信号用于强制杀死进程,此信号进程无法忽视,直接在系统层面将进程杀死,所以在Python中它是不能监听的。
# 终端退出
signal.SIGQUIT
# 终止信号,软件终止信号。
signal.SIGTERM
当终端用户输入kill sigerm pid时对应PID的进程会接收到此信号,此信号进程是可以捕获并指定函数处理。比如做一下程序清理等工作,当然也是可以忽视此信号的。
# 闹钟信号,由signal.alarm()发起。
signal.SIGALRM
# 继续执行暂停进程
signal.SIGCONT
信号处理函数
设置发送SIGALRM信号的定时器
signal.alarm(time)
功能:在time秒后向进程自身发送SIGALRM信号
参数:time为时间参数,单位为秒。
例如:设置时钟
$ vim sigalrm.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import signal, time
# 3秒后终止程序
signal.alarm(3)
while True:
time.sleep(1)
print("working")
$ python sigalrm.py
working
working
闹钟
一个进程中只能设置一个时钟,如果设置第二个则会覆盖第一个的时间,并返回第一个的剩余时间,同时第一个闹钟返回为0。
例如:当在一个程序中出现两个signal.alarm()函数时
$ vim sigalrm.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import signal, time
# 3秒后终止程序
print(signal.alarm(3)) # output:0
time.sleep(1)
print(signal.alarm(3)) # output:2
while True:
time.sleep(1)
print("working")
$ python sigalrm.py
0
2
working
working
闹钟
使用signal.pause阻塞函数,让进程暂停以等待信号,也就时阻塞进程执行,简单来说当接收到信号后使进程停止。
例如:
$ vim sigalrm.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import signal, time
# 3秒后终止程序
print(signal.alarm(3)) # output:0
time.sleep(1)
print(signal.alarm(3)) # output:2
# 阻塞等待信号的发生,无论什么信号都可以。
signal.pause()
while True:
time.sleep(1)
print("working")
$ python sigalrm.py
0
2
闹钟
使程序进入休眠
signal.pause()
作用:使程序进入休眠直到程序接收到某个信号量
获取当前程序注册signalnum信号量的处理函数
signal.getsignal(signalnum)
作用:获取当前程序注册signalnum信号量的处理函数
返回值:可能使Python可调用对象如signal.SIG_DFL、signal.SIG_IGN、None。
设置信号处理函数
signal.signal(sig, handler)
功能:按照handler处理器制定的信号处理方案处理函数
参数:
sig拟需处理的信号 ,处理信号只针对这一种信号其作用。
handler信号处理方案,进程可以无视信号采取默认操作也可自定义操作。
当handler为下列函数时将有如下操作
SIG_IGN信号被无视ignore或忽略
SIG_DFL进程采用默认default行为处理
function处理器handler作为函数名称时,进程采用自定义函数处理。
SIGSTOP SIGKILL不能处理只能采用
例如:
$ vim signal.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import signal, time
# 3秒后终止程序
signal.alarm(3)
# 当遇到SIGINT即CTRL+C时忽略SIG_IGN
signal.signal(signal.SIGINT, signal.SIG_IGN)
# 阻塞等待信号的发生,无论什么信号都可以。
signal.pause()
$ python signal.py
闹钟
信号拦截
为什么需要设置信号拦截呢?如果使用多线程或多协程,为了防止主线程结束而子线程和子协程还在运行,此时就需要使用signal模块,使用signal模块可以绑定一个处理函数,当接收步到信号的时候不会立即结束程序。
在Python中拦截信号通常有两种方式
第一种是发出kill信号
# SIGTERM 表示关闭程序信号
signal.signal(signal.SIGTERM, self._term_handler)
第二种是发出CTRL+C信号
# SIGINT表示CTRL+C信号
signal.signal(signal.SIGINT, self._term_handler)
在多线程多协程的程序设计时,一般多线程或的多协程程序在设计时应该设计一个程序终止标记,当收到终止信号的时候,让终止标记状态由False修改为True,此时运行的程序只有终止标记在False状态下时才能够以运行。如果由需要休眠的协程,还应给协程增加一个休眠标记,当程序休眠的时候休眠标记设置为True,当收到终止信号的时候,不仅仅要把终止标记设置为True,还要将休眠中的协程结束掉。
argparse:
argparse是python用于解析命令行参数和选项的标准模块,类似于linux中的ls指令,后面可以跟着不同的参数选项以实现不同的功能,argparse就可以解析命令行然后执行相应的操作。
argparse 使用
使用argparse 配置命令行参数时,需要三步:
创建 ArgumentParser() 对象
调用 add_argument() 方法添加参数
使用 parse_args() 解析添加的参数
复制代码
parser = argparse.ArgumentParser()
parser.add_argument("-p", "–port",
dest='port',
default="/dev/ttyUSB0",
help="serial port where the MCU is connected to.)
parser.add_argument("-v", "–version",
dest='version',
action='store_true',
help="show the version number of this program and exit.")
args = parser.parse_args()
复制代码
某些情况下,你想将参数按照功能进行概念分组,以便用户方便使用,比如写操作的参数作为一个组,读操作的参数作为一个组,可以使用 ArgumentParser.add_argument_group(title=None, description=None) 定义一个组。
1 info_group = parser.add_argument_group('Device information')
2 read_group = parser.add_argument_group('Read and compare functions')
3 write_group = parser.add_argument_group('Erase and write functions')
4 run_group = parser.add_argument_group('Code execution functions')
方法参数查找表
1.ArgumentParser类
class argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars=’-‘, fromfile_prefix_chars=None, argument_default=None, conflict_handler=’error’, add_help=True, allow_abbrev=True)
参数:
prog:程序的名字
usage:默认情况下,ArgumentParser依据它包含的参数计算出帮助信息
description:这个参数给出程序做什么以及如何工作的简短描述
epilog:显示额外的关于程序的描述
parents:有时候,几个解析器会共享一个共同的参数集。可以使用一个带有所有共享参数的解析器传递给ArgumentParser的parents=参数,而不用重复定义这些参数
formatter_class:ArgumentParser对象允许通过指定一个格式化类来定制帮助信息的格式(argparse.RawDescriptionHelpFormatter、argparse.RawTextHelpFormatter、argparse.ArgumentDefaultsHelpFormatter、argparse.MetavarTypeHelpFormatter)
prefix_chars:修改前缀符
fromfile_prefix_chars:以任意一个给定字符开始的参数将被当做文件,并且将被这些文件包含的参数替换
argument_default:指定一个解析器范围的参数默认值
allow_abbrev:允许使用缩写(默认)
conflict_handler:关于设置同一个选项具有两个动作
add_help
2.ArgumentParser对象add_argument()方法
ArgumentParser.add_argument(name or flags…[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
参数
name or flags:传递给add_argument() 的第一个参数因此必须是一个标记序列或者一个简单的参数名字
action:指出应该如何处理命令行参数(支持的操作:’store’ ,’store_const’,’store_true’,’store_false’,’append’,’append_const’,’count’,’help’,’version’)
nargs:将一个动作与不同数目的命令行参数关联在一起(支持的值:N,’?’,’*’,’+’)
const:用于保存常量值,它们不是从命令行读入但是是ArgumentParser 的动作所要求的
default:其默认值为None,指出如果命令行参数没有出现时它们应该是什么值
type:允许任意必要的类型检查并作类型转换
choices:某些命令行参数应该从一个受限的集合中选择
required:如果要使得选项是必需的,可以指定True作为required=关键字参数的值给add_argument()
help:包含参数简短描述的字符串
metavar:默认情况下,对于位置参数直接使用dest的值,对于可选参数则将dest的值变为大写。注意metavar只会改变显示出来的名字parse_args() 对象中属性的名字仍然由dest的值决定。
dest:对于位置参数的动作,dest 通常作为第一个参数提供给add_argument(),对于可选参数的动作,dest的动作通常从选项字符串推导出来,如:ArgumentParser生成的dest的值是将第一个长的选项字符串前面的–字符串去掉。如果没有提供长选项字符串,dest的获得则是将第一个短选项字符串前面的-字符去掉。任何内部的-将被转换为字符以确保字符串是合法的属性名字。(即对于可选参数,先找长的选项字符串,再找短选项字符串,并且内部的-会被转换为字符。)
Action类
class argparse.Action(option_strings, dest, nargs=None, const=None, default=None, type=None, choices=None, required=False, help=None, metavar=None)
3.ArgumentParser对象parse_args()方法
将参数字符串转换成对象并设置成命名空间的属性。返回构成的命名空间。
之前对add_argument() 的调用完全决定了创建什么对象以及如何设置。
选项值语法,parse_args()方法支持几种指定一个选项的值的方法:
最简单的方法是,将选项和它的值以两个分开的参数传递
对于长选项(名字长度超过一个字符的选项),选项和它的值还可以用一个单一的命令行参数传递,并用=分隔它们
对于短选项(长度只有一个字符的选项),选项及其值可以连在一起
几个短选项可以连在一起仅使用一个-前缀,只要只有最后一个选项要求有值或者都不要有值
无效参数
在解析命令行的同时,parse_args()会检查各种错误,包括有歧义的选项、不合法的类型、不合法的选项、错误的位置参数个数等等。当它遇到此类错误时,会退出并跟随用法信息一起打印出错误。
参数包含“ – ”
parse_args()方法每当用户犯了明确的错误时会努力给出错误信息,但是有些情况天生就有歧义。例如,命令行参数-1既可以是想指明一个选项也可以是想提供一个位置参数。这里parse_args()会非常小心:位置参数只有在它们看上去像负数且解析器中没有选项看上去是负数时才可以以-开始。
如果你有必须以- 开始的位置参数且不是负数,你可以插入伪参数’–’告诉parse_args()其后的所有内容都为位置参数。
参数缩写(前缀匹配)
参数不来自sys.argv
有时候可能需要ArgumentParser解析的参数不是来自sys.argv。这可以通过传递一个字符串列表给parse_args()来完成
4.class argparse.Namespace
parse_args() 默认使用的简单的类,用于创建一个保存属性的对象并返回该对象。
有时可能需要让ArgumentParser分配属性给一个已经存在的对象而不是一个新的Namespace对象。这可以通过指定namespace=关键字参数达到。
“Python类有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/209003.html