python 实现脚本编程和系统管理

  • 文章
  • 作者:Hubery
  • 发布时间:2020-05-23
  • 阅读数:60
  • 分类:python
  • 标签: python

一、前言

最近阅读python3-cookbook,里面有一章涉及python来实现脚本编程和系统管理,也就是shell脚本实现的功能。因为这部分目前也没有实际的应用需求,因此这里简单总结,以备以后有需要用到的时候能快速定位到需要用到的知识点。

二、基本内容

1、通过重定向/管道/文件接受输入

  • 你希望你的脚本接受任何用户认为最简单的输入方式,包括将命令行的输出通过管道传递给改脚本,重定向文件到该脚本,或在命令行中传递一个文件名或文件名列表给改脚本。

  • 可以使用python 内置的fileinput模块

2、终止程序并给出错误信息

  • 你想向标准错误打印一条消息并返回某个非零状态吗来终止程序运行

  • 可以抛出SystemExit异常,并使用错误消息作为参数

3.解析命令行选项

推荐使用后面argparse、click、fire

4、运行时弹出密码输入提示

  • 可以使用python的getpass 模块

5、获取终端的大小

  • 获取当前终端大小,以便正确的格式化输出

  • 使用os.get_terminal_size()函数来实现

6、执行外部命令并获取它的输入

7、复制或者迁移文件和目录

  • 使用shutil 可以很方便的实现

import shutil

# Copy src to dst. (cp src dst)
shutil.copy(src, dst)

# Copy files, but preserve metadata (cp -p src dst)
shutil.copy2(src, dst)

# Copy directory tree (cp -R src dst)
shutil.copytree(src, dst)

# Move src to dst (mv src dst)
shutil.move(src, dst)

8、创建和解压归档文件

  • shutil 模块拥有两个函数—— make_archive() 和 unpack_archive() 可派上用场

  • 其他的模块:tarfile、zipfile、gzip、bz2等

9.通过文件名查找文件

  • 可以使用os.walk()。 这个函数返回三个元组 分别为relpath, dirs, files

10、读取配置文件

  • python中配置配置文件可以直接使用python文件进行配置,可以直接用import引入

  • 使用.ini 文件配置,此时需要configparser模块读取配置文件

  • 使用.yml 文件配置,此时需要使用yaml模块读取配置

11、给简单的脚步增加日志功能

  • 使用longing模块

import logging

def main():
    # Configure the logging system
    logging.basicConfig(
        filename='app.log',
        level=logging.ERROR
    )

    # Variables (to make the calls that follow work)
    hostname = 'www.python.org'
    item = 'spam'
    filename = 'data.csv'
    mode = 'r'

    # Example logging calls (insert into your program)
    logging.critical('Host %s unknown', hostname)
    logging.error("Couldn't find %r", item)
    logging.warning('Feature is deprecated')
    logging.info('Opening file %r, mode=%r', filename, mode)
    logging.debug('Got here')

if __name__ == '__main__':
    main()

12、实现一个计时器

  • 使用time模块进行计时

  • 方案一:使用装饰器实现一个函数运行的计时器

import time
def timer(func):
    def wrapper(*args, **kwargs):
        start = time.perf_counter()
        restult = func(*args, **kwargs)
        end = time.perf_counter()
        print(end - start)
        return restult
    return wrapper
@timer
def countdown(n):
    while n > 0:
        n -= 1
countdown(1000000)
# 0.05622637700002997
  • 使用类定义一个可以启动 停止 重置 的计时器

import time
class Timer:
    def __init__(self, func=time.perf_counter):
        self.elapsed = 0.0
        self._func = func
        self._start = None
    # 启动
    def start(self):
        if self._start is not None:
            raise RuntimeError('Already started')
        self._start = self._func()
    # 停止
    def stop(self):
        if self._start is None:
            raise RuntimeError('Not started')
        end = self._func()
        self.elapsed += end - self._start
        self._start = None
    # 重置   
    def reset(self):
        self.elapsed = 0.0
    # 获取运行状态 
    @property
    def running(self):
        return self._start is not None
    # 实现上下文管理 可以使用with 
    def __enter__(self):
        self.start()
        return self
    def __exit__(self, *args):
        self.stop()
# 使用
t = Timer()
t.start()
countdown(1000000)
print(t.running)
t.stop()
print(t.elapsed)
print(t.running)
t.start()
t.reset()
countdown(1000000)
t.stop()
print(t.elapsed)

# 结果
True
0.05854388499983543
False
0.048935402999859434

13.限制内存和CPU的使用量

  • 可以使用resource模块来实现这个任务

14.启动一个WEB浏览器

  • webbrowser 模块能被用来启动一个浏览器,并且与平台无关。


评论列表
优秀的你不评论一下咩!!
新的评论