os + sys
# -*- coding:utf8 -*-
"""
# editor: hjjdreamer
# create-time: 2022/12/4-9:12
# Python-Script: chapter9-2-module-os+sys.py
# describe: https://docs.python.org/zh-cn/3.8/library/os.html
"""
import os
"""
os package function
与操作系统有关
系统 ==> 变量 + 操作
文件 + 目录 ==> 操作
命令执行 ==> 可以跨操作系统操作,支持 Linux + window 不同平台
进程管理
"""
# 系统相关内容查询
print(f"os = {os.name}")
print(f"env = {os.environ}")
print(f"file and dir sep = {os.sep}")
print(f"环境变量分隔符 = {os.pathsep}")
print(f"文件的换行分隔符 = {os.linesep} ('\\r\\n')")
# 文件+目录操作
# 创建文件夹
# 要创建的目录,可以是相对或者绝对路径,默认是当前文件夹
# os.mkdir("std_demo")
# 删除目录
# os.rmdir("std_demo")
# 创建多级目录
# os.makedirs("./std_demo/1/1.1/1.1.1")
# 删除多级目录
# os.removedirs("./std_demo/1/1.1/1.1.1")
# 查看目录状态
# os.stat("./std_demo")
"""
获取当前文件路径
os.path
"""
print(f"当前目录绝对路径 == {os.getcwd()}") # 当前目录绝对路径 == E:\*****\python\ithelma
file1 = os.path.basename(__file__)
print(f"{file1}") # chapter9-2-module-os+sys.py
file2 = os.getcwd() + file1
print(f"{file2}") # E:\****\python\ithelmachapter9-2-module-os+sys+argpass.py
print(os.path.split(file2)) # ('E:\\****\\python', 'ithelmachapter9-2-module-os+sys+argpass.py')
# 判断绝对路径
print(os.path.isabs(file1)) # False
print(os.path.isabs(file2)) # True
"""
判断文件是否存在
os.path.exists(file_name)
"""
print(f"chapter9-2-module-os+sys.py is exist ? == {os.path.exists(file1)}.")
# 执行命令
# 本脚本调用相应路径下的其他脚本
os.system("my_module1.py")
import os
# pwd
print(os.getcwd())
# ls -a
# 返回文件列表
# os.listdir("目标路径")
print(os.listdir())
# 创建目录
"""
os.mkdir("") 没办法连续创建 mkdir
os.mkdirs 连续创建目录 mkdir -p
"""
# 切换目录
"""
os.chdir("/tmp/abc")
"""
"""
os.remove("file") 只能删除文件不能删除目录
建议使用shutil.rmtree()
"""
"""
创建软链接
os.symlink("原来链接", "软连接")
取消软链接
os.unlink()
"""
"""
os.path.basename()
获取文件名
"""
"""
os.path.dirname()
获取路径名
"""
"""
os.path.join("/etc/selinux", "config")
路径拼接
"""
"""
os.path.exists("路径") 判断是否存在
"""
"""
sys
针对python解析器相关的变量和方法
与程序执行有关
https://docs.python.org/zh-cn/3.8/library/sys.html
"""
import sys
# 获取版本
print(f"python version = {sys.version}")
# 获取PYTHON文件的路径,返回列表
print(sys.path)
# 获取运行平台
print(sys.platform)
# 获取版本信息
print(sys.copyright)
# 默认的编码方式
print(sys.getdefaultencoding())
# 文件系统的默认编码方式
print(sys.getfilesystemencoding())
# 获取循环限制次数
print(sys.getrecursionlimit()) # default == 1000
# 假如程序运行 1000 次都没有结束(死循环),则会报错
sys.setrecursionlimit(1500)
print(sys.getrecursionlimit())
sys.setrecursionlimit(1000)
print(sys.getrecursionlimit())
# 退出返回状态码,默认是0
# sys.exit(1) # Process finished with exit code 1
"""
sys.argv
"""
# 参数将会以列表的形式传入程序
# PS E:\******\python\ithelma> python ./chapter9-2-module-os+sys.py 78
# 9 adad qeqw
# sys.argv == ['./chapter9-2-module-os+sys.py', '789', 'adad', 'qeqw']
# 所有命令行参数以空格为分隔符,都保存在了sys.argv列表中。其中第1个为脚本的文件名。
"""
选项的写法要求
对于短格式:
"-"号后面要紧跟一个选项字母。
如果还有此选项的附加参数,可以用空格分开,也可以不分开。
长度任意,可以用引号。
example:
-o
-oa
-obbbb
-o bbbb
-o "a b"
对于长格式:
"--"号后面要跟一个单词。
如果还有些选项的附加参数,后面要紧跟"=",再加上参数。
"="号前后不能有空格。
example:
--help=file1
"""
# 参数获取
# print(f"sys.argv == {sys.argv}")
# sys.argv == ['E:/******/python/ithelma/chapter9-2-module-os+sys.py']
# argv[0] == 脚本本身文件
def show_argv_func():
print(f"sys.argv == {sys.argv}")
print(f"parameters list == {sys.argv[1:]}")
print(f"str == {sys.argv[1]}")
print(f"int == {sys.argv[2]}")
print(f"float == {sys.argv[3]}")
print("----------------------------------")
def show_argv_func2(str2, int2, float2):
print(f"str == {str2}")
print(f"int == {int2}")
print(f"float == {float2}")
if __name__ == "__main__":
show_argv_func()
# Process finished with exit code 1 ==> 没有传参直接ctrl+shift+F10会报错
# Traceback(most recent call last):
# File "E:/*****/python/ithelma/chapter9-2-module-os+sys.py", line159, in < module >
# show_argv_func()
# File "E:/*****/python/ithelma/chapter9-2-module-os+sys.py", line144, in show_argv_func
# print(f"str == {sys.argv[1]}")
# IndexError: list index out of range
show_argv_func2("dasasdf", 123456, 543.213)
# PS E:\******\python\ithelma> python ./chapter9-2-module-os+sys.py sd 123 123.645
# sys.argv == ['./chapter9-2-module-os+sys.py', 'sd', '123', '123.645']
# parameters list == ['sd', '123', '123.645']
# str == sd
# int == 123
# float == 123.645
# PS E:\*****\python\ithelma> python ./chapter9-2-module-os+sys.py sd 123 123.645
# ...
# sys.argv == ['./chapter9-2-module-os+sys.py', 'sd', '123', '123.645']
# parameters list == ['sd', '123', '123.645']
# str == sd
# int == 123
# float == 123.645
# ----------------------------------
# sys.argv == ['./chapter9-2-module-os+sys.py', 'sd', '123', '123.645']
# parameters list == ['sd', '123', '123.645']
# str == dasasdf
# int == 123456
# float == 543.213
argparse
# -*- coding:utf8 -*-
"""
# editor: hjjdreamer
# create-time: 2022/12/4-13:05
# Python-Script: chapter9-3-modular-argparse.py
# describe:
作用:
argparse 是 Python 内置的一个用于命令项选项与参数解析的模块
通过在程序中定义好我们需要的参数,argparse 将会从 sys.argv 中解析出这些参数,并自动生成帮助和使用信息
argparse优点
方便读取命令行参数
参数与代码分离,方便测试
自动生成帮助文档
https://docs.python.org/zh-cn/3.8/howto/argparse.html
https://www.bilibili.com/video/BV1U4411j7xb/?from=search&seid=13385348553890569010&vd_source=19d68c51d074de183fd2e6b1b1cb0a9b
https://www.jianshu.com/p/ea52fdfaa4ad
https://blog.csdn.net/qq_36653505/article/details/83788460
https://blog.csdn.net/qq_41731861/article/details/120827681?spm=1001.2101.3001.6650.13&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EESLANDING%7Edefault-13-120827681-blog-125710450.pc_relevant_landingrelevant&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EESLANDING%7Edefault-13-120827681-blog-125710450.pc_relevant_landingrelevant&utm_relevant_index=21
"""
"""
#(1)首先导入模块 == import argparse
#(2)创建一个解析对象 == parser = argparse.ArgumentParser()
#(3)向该对象中添加你要关注的命令行参数和选项 == parser.add_argument()
#(4)进行解析 == parser.parse_args()
"""
import math
import argparse
def parse_args():
"""
# 获取一系列变量
:return: args
"""
# 初始化解析对象
parse1 = argparse.ArgumentParser(description="Calculate cylinder volume")
# description: 函数描述干什么事情
# 添加参数
"""
-
--
default=""
"""
parse1.add_argument('-r', '--radius', default=2, type=int, help='Radius of Cylinder') # 半径
# 在参数名前加 --,设置为可选参数。如果未输入,则使用default默认值(若未设置default,则会默认赋值None)
# 通过将可选参数设置引用名,可以缩短参数名-r,简化命令行参数输入。
"""
type
help
"""
parse1.add_argument('height', metavar="", type=int, help='height of Cylinder') # 高
# 通过设置required=True后,无论参数是否是可选参数,都必须输入。
# args进行解析,获取对象
args1 = parse1.parse_args() # 这里定义了接口
return args1
def cal_vol(radius, height):
"""
# 计算出圆柱体的体积
:param radius: parse1.add_argument == radius
:param height: parse1.add_argument == height
:return: vol
"""
vol = math.pi * pow(radius, 2) * height
# vol = math.pi * (radius ** 2) * height
return vol
if __name__ == "__main__":
args1 = parse_args()
print(cal_vol(args1.radius, args1.height)) # 接口名叫args1
# 5、使用解析对象.参数获取使用命令行参数
# 默认命令-h可以获取添加参数时设置的帮助信息
sys + format 的使用方法
# -*- coding:utf8 -*-
import sys
def main(args):
param_list = args[1].split("~")
country = param_list[0]
custom_db = param_list[1]
cdm_db = param_list[2]
country_1 = param_list[3]
custom_db_1 = param_list[4]
cdm_db_1 = param_list[5]
# 第一种系统变量传参方式
print(f"country = {country} custom_db = {custom_db} cdm_db = {cdm_db}")
# country = cn custom_db = abc_db cdm_db = def_db
# 第二种系统变量传参方式
param_list1 = {"country_1": country_1, "custom_db_1": custom_db_1, "cdm_db_1": cdm_db_1}
print(f"{country_1}\n{custom_db_1}\n{cdm_db_1}".format(**param_list1))
# hk
# hk_db_1
# hk_db-2
if __name__ == "__main__":
main(sys.argv)
Pycharm 系统变量配置
![](https://i-blog.csdnimg.cn/blog_migrate/c6c008d39a586428393f44d0f3e8ab26.png)
shutil
# -*- coding:utf8 -*-
"""
# editor: hjjdreamer
# create-time: 2023/4/20-9:42
# Python-Script: 32_module_shutil.py
# describe:
通过python 执行 shell
sh + util
主要针对 copy + delete + mv + 压缩等
对os的补充
"""
"""
obj 文件管家
复制操作
shutil.copyfileobj(源文件, 目标文件)
"""
import shutil
fr = open(r"./write_file.txt",mode="r")
fw = open(r"./write_file_shutil.txt",mode="w")
shutil.copyfileobj(fr, fw)
fr.close()
fw.close()
"""
复制非文本数据
shutil.copyfile("源文件路径", "目标文件路径")
内容可以复制但是权限无法复制
"""
shutil.copyfile(r"./write_file.txt", r"./write_file_1.txt")
"""
shutil.copy("源文件路径", "目标文件路径")
文件内容和权限都可以复制
建议主要使用
"""
shutil.copy(r"./write_file.txt", r"./write_file_2.txt")
"""
重命名文件
shutil.move("源文件路径", "目标文件路径")
类似于
mv /opt/myls /opt/myls3
"""
shutil.move(r"./write_file_shutil.txt", r"./write_file_shutil_3.txt")
"""
复制目录
不能创建目录
shutil.copytree("源文件路径", "目标文件路径")
"""
# 目标文件路径必须不存在
# shutil.copytree(r"/etc/security", "/opt/security")
"""
空目录和非空目录都可删除
shutil.rmtree(r"/opt/security")
"""
# 权限操作
"""
只复制文件权限
shutil.copymode("源文件路径", "目标文件路径")
chmod
"""
# 属主 和 属组 操作
"""
shutil.chown("文件路径", user=xxx, group=xxx)
"""