python专区--相关模块详解

相关模块详解

shutil 模块

基本概念

  • shutil 可以简单地理解为 sh + utilshell 工具 的意思
  • shutil 模块是对 os 模块的补充,主要针对文件的 拷贝、删除、移动、压缩和解压 操作

shutil 模块的主要方法

复制和移动

shutil.copyfileobj(fsrc, fdst)
  • 将文件的对象 fsrc 的内容复制到文件的对象 fdst

案例

import shutil
# 复制
# 1. shutil.copyfileobj(源文件管家,目标文件管家):只能复制文件的内容,无法复制权限
fr = open("/etc/hosts", mode="r")
fw = open("/opt/myhosts", mode="w")
shutil.copyfileobj(fr, fw)
fr.close()
fw.close()
shutil.copyfile(src, dst)
  • 将名为 src 的文件的内容复制到名为 dst 的文件

案例

import shutil    
# 2. shutil.copyfile(源文件路径, 目标文件路径):只能复制文件的内容,无法复制权限
shutil.copyfile("/usr/bin/ls", "/opt/myls")
shutil.copy(src, dst)

将文件 src 复制到文件或目录 dst,包括权限

案例

import shutil  # 导入模块(如果已经导入,则不需要再次导入)
# 3. shutil.copy(源文件路径, 目标文件路径):既能复制文件的内容,也能复制权限
shutil.copy("/usr/bin/ls", "/opt/myls2")
shutil.move(src, dst)
  • 递归地将文件或目录(src)移动到另一个位置(dst),并返回目标

案例

import shutil  # 导入模块(如果已经导入,则不需要再次导入)
shutil.move("/opt/myls2", "/opt/myls3")

目录操作

shutil.copytree(src, dst)

  • 递归地复制以 src 为根的整个目录树,返回目标目录。由 dst 命名的目标目录不能已经存在

案例

import shutil  # 导入模块(如果已经导入,则不需要再次导入)
shutil.copytree('/etc/security', '/opt/security')  # 使用copytree()时,需要指定一个不存在的目录,否则报错

shutil.rmtree(path)

  • 删除整个目录树; **路径 **必须指向目录, 空目录或者非空目录都可使用
import shutil  # 导入模块(如果已经导入,则不需要再次导入)
shutil.rmtree("/opt/security")

权限管理

shutil.copymode(src, dst)
  • 将权限位从 src 复制到 dst
  • 文件内容,所有者和组不受影响
  • srcdst 是以字符串形式给出的路径名称

案例

import shutil  # 导入模块(如果已经导入,则不需要再次导入)
# 使用shutil模块的copymode()功能【只拷贝权限】
shutil.copymode("/usr/bin/ls", "/opt/myhosts")
shutil.chown(path, user=None, group=None)
  • 更改给定 路径 的所有者 用户

案例

import shutil  # 导入模块(如果已经导入,则不需要再次导入)
shutil.chown("/opt/myhosts",user="cuihua",group="cuihua")

os 模块

  • 对文件系统的访问大多通过 python 的 os 模块实现
  • 该模块是 python 访问操作系统功能的主要接口
  • 有些方法,如:copy 等,并没有提供,可以使用 shutil 模块作为补充
# os模块的常用方法
>>> import os				#导入os系统模块
>>> os.						#os.<Tab><Tab> 查看os模块的所以方法
>>> os.getcwd()				#getcwd(),查看当前所处的文件路径,类似于: pwd
>>> os.listdir()			#listdir(), 查看当前目录下的所有文件(包括隐藏文件),类似于:ls -a
>>> os.listdir('/tmp')		#listdir('/tmp'), 查看/tmp目录下的内容,类似于:ls /tmp
>>> os.mkdir('/tmp/mytest')		#mkdir(), 创建目录,类似于:mkdir /tmp/mytest
>>> os.mkdir('/tmp/demo/abc')			#只能创建单级目录,父目录无法创建
>>> os.makedirs('/tmp/demo/abc')		#创建目录时,父目录不存在,会自动创建,类似于: mkdir -p ...
>>> os.chdir('/tmp/demo')		#chdir(), 切换当前所处的文件位置,类似于:cd /tmp/demo
>>> os.getcwd()				#getcwd(),查看当前所处的文件路径,类似于: pwd
>>> os.listdir()			#listdir(), 查看当前目录下的所有文件(包括隐藏文件),类似于:ls -a
>>> os.symlink('/etc/passwd', 'mima')		#symlink(), 为/etc/passwd建立软链接mima,类似于: ln -s /etc/passwd  mima
>>> os.remove('abc')		#remove(), 只能删除单个文件,不能删除目录
>>> os.rmdir('abc')			#rmdir(),只能删除空目录;要删除非空目录要使用shutil.rmtree()
>>> os.rmdir('/var/tmp')		#rmdir(),只能删除空目录;要删除非空目录要使用shutil.rmtree()
>>> os.unlink('mima')		#unlink(),取消删除链接文件

>>> os.path.				#查看os.path子模块的所有方法
>>> os.mkdir('abc')			#mkdir(), 在当前路径下,创建一个目录'abc'
>>> os.path.abspath('abc')		#abspath(), 获取abc文件的路径
>>> os.path.basename('/tmp/demo/abc')		#获取最右边'/',右边的数据‘abc’
>>> os.path.basename('/tmp/demo/abc/')		#basename(),获取最右边'/',右边的数据''
>>> os.path.dirname('/tmp/demo/abc')		#dirname(), 获取最右边'/',左边的数据'/tmp/demo'
>>> os.path.split('/tmp/demo/abc')		#split(), 路径切割,从最右边'/'开始,进行切割
>>> os.path.join('/tmp/demo', 'abc')		#join(), 路径的拼接
>>> os.path.is						#os.path.is<Tab><Tab>, 列出所有判断的方法
>>> os.path.isabs('tmp/abc/xyz')		#'tmp/abc/xyz'是否是绝对路径,不管文件是否存在,False
>>> os.path.isabs('/tmp/abc/xyz')		#'/tmp/abc/xyz'是否是绝对路径,不管文件是否存在,True
>>> os.path.isdir('/tmp/demo/abc')		# 字符串是否为目录(文件必须存在,且必须是目录) ,True
>>> os.path.isdir('/tmp/demo/xyz')		# 字符串是否为目录(文件必须存在,且必须是目录),False
>>> os.path.isfile('/etc/hosts')		#字符串是否是文件(文件必须存在,且必须是文件),True
>>> os.path.isfile('/etc/')			#字符串是否是文件(文件必须存在,且必须是文件),False
>>> os.path.islink('/etc/grub2.cfg')			#字符串是否是链接文件(文件必须存在,且必须是链接文件),True		#判断字符串是否是挂载文件,'/etc' 不是挂载文件
>>> os.path.exists('/etc/hostname')			#判断字符串是否存在,/etc/hostname,True

subprocess 模块

基础概念

  • subprocess 模块主要用于执行 系统命令
  • subprocess 模块允许你产生新的进程,并获得它们的返回状态
  • 通俗地说就是通过这个模块,你可以在 Python 的代码里执行操作系统级别的命令,比如 “ifconfig” 、“du -sh” 等等

run 方法

功能:执行 args 参数所表示的命令,等待命令结束,并返回一个 CompletedProcess 类型对象

>>> import subprocess
>>> subprocess.run(['ls'])  # 将命令写到列表中,执行linux命令
>>> subprocess.run(['ls', '/home'])  # 将命令和操作的目录写到列表中,执行linux命令
>>> subprocess.run('ls /home')  # 以字符串形式执行linux命令,无法区分命令和目标文件,错误,会把'ls /home 当做一个整体
>>> subprocess.run('ls /home', shell=True)  # 若想以字符串形式执行,指定shell解释器

通过 shell 执行命令

  • subprocess.run(['ls', '/home']) 这种方式不支持环境变量,不支持命令的扩展,不支持 shell解释器 下执行命令,所以使用字符串的方式执行 linux命令
>>> subprocess.run('echo $HOME', shell=True)  # 使用run()查看当前用户的家目录,使用shell执行命令
>>> subprocess.run('ls /root', shell=True)

run 方法返回值

  • run 方法查看上一级目录下的内容,使用 shell 执行命令
>>> subprocess.run('ls ..', shell=True)  # 最后一行为返回值
day01  day02  day03  day04
CompletedProcess(args='ls ..', returncode=0)

# run方法查看上一级目录下的内容,赋值给变量result
>>> result = subprocess.run('ls ..', shell=True)
day01  day02  day03  day04

# 查看变量result的值,为run()的返回值
>>> result
CompletedProcess(args='ls ..', returncode=0)

# 查看result中args列表的内容,为linux命令
>>> result.args
'ls ..'

# 查看result中returncode的值,为0;returncode 为状态码
# 上一条命令执行成功,结果为0;反之,结果为非零值
>>> result.returncode
'0'

注意

  • subprocess 模块虽然可以支持所有的 linux 命令,但不可乱用,放弃其他的模块
  • subprocess 模块编写的代码,不具有跨平台性,不能在 windows,mac 等系统使用

练习:调用 ping 命令

需求

  • 调用 ping 命令
    • 编写 ping 函数
    • 用于测试远程主机的联通性
    • ping 通显示:x.x.x.x:up
    • ping 不通显示:x.x.x.x:down
import subprocess  # 导入subprocess模块,用于执行linux的ping命令
def ping(host):  # 使用def定义函数ping(),用于检测主机的联通性
# subprocess.run() 在shell解释器下,执行linux命令;ping -c 2 发送两个数据包;
# %s 为占位符;&> /dev/null 将错误和正确信息都写入黑洞设备;
# result 获得run()得放回信息,returncode为状态码(0 指命令成功;非0 指失败)
    result = subprocess.run('ping -c 2 %s &> /dev/null' % host, shell=True)    
    if result.returncode == 0:
        return '%s:up' % host
    else:
        return '%s:down' % host

# 测试代码块,__name__作为python文件调用时,执行该代码块
if __name__ == '__main__':
	print(ping("127.0.0.1"))

猜你喜欢

转载自blog.csdn.net/m0_52508197/article/details/127201947