仅需5道题轻松掌握Python命令行相关标准库 | Python技能树征题

Posted 盼小辉丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了仅需5道题轻松掌握Python命令行相关标准库 | Python技能树征题相关的知识,希望对你有一定的参考价值。

0. 前言

许多用户习惯于使用命令行工具与系统进行交互,因此 Python 中的提供了相应的标准库,用于向通过 shell 和文本与用户进行交互的软件提供常见方法和函数,我们就通过 5Python 编程题来掌握 Python 相关标准库玩转命令行!

1. 第 1 题:命令行日志记录

知识点描述:使用 Python logging 模块记录运行信息。
问题描述:默认情况下 logging 模块只会输出错误信息,如何使 logging 记录程序运行中包括警告等更普通的运行信息,请从以下选项中选出你认为正确的答案:
A.

import logging, sys
logging.basicConfig(level=logging.INFO, stream=sys.stderr, format='%(asctime)s %(name)s %(levelname)s %(message)s')
log = logging.getLogger(__name__)
def my_add(a, b, weight=1):
    log.info('Starting add')
    if a == b == 0:
        log.warning('Warning! 0 for any one')
    res = (a + b) * weight
    log.info('(%s + %s) * %s = %s' % (a, b, weight, res))
    print(res)
if __name__ == '__main__':
    my_add(5, 3)
    my_add(0, 0)

B.

import logging, sys
logging.basicConfig(level=logging.ERROR, stream=sys.stderr, format='%(asctime)s %(name)s %(levelname)s %(message)s')
log = logging.getLogger(__name__)
def my_add(a, b, weight=1):
    log.info('Starting add')
    if a == b == 0:
        log.warning('Warning! 0 for any one')
    res = (a + b) * weight
    log.info('(%s + %s) * %s = %s' % (a, b, weight, res))
    print(res)
if __name__ == '__main__':
    my_add(5, 3)
    my_add(0, 0)

C.

import logging, sys
logging.basicConfig(level=logging.NOTSET, stream=sys.stderr, format='%(asctime)s %(name)s %(levelname)s %(message)s')
log = logging.getLogger(__name__)
def my_add(a, b, weight=1):
    log.info('Starting add')
    if a == b == 0:
        log.warning('Warning! 0 for any one')
    res = (a + b) * weight
    log.info('(%s + %s) * %s = %s' % (a, b, weight, res))
    print(res)
if __name__ == '__main__':
    my_add(5, 3)
    my_add(0, 0)

D.

import logging, sys
logging.basicConfig(level=logging.WARN, stream=sys.stderr, format='%(asctime)s %(name)s %(levelname)s %(message)s')
log = logging.getLogger(__name__)
def my_add(a, b, weight=1):
    log.info('Starting add')
    if a == b == 0:
        log.warning('Warning! 0 for any one')
    res = (a + b) * weight
    log.info('(%s + %s) * %s = %s' % (a, b, weight, res))
    print(res)
if __name__ == '__main__':
    my_add(5, 3)
    my_add(0, 0)

正确答案: A

2. 第 2 题:将日志存储在磁盘上

知识点描述:将日志信息写入磁盘文件中。
问题描述:编写斐波那契计算函数,并用日志文件记录计算出的数字以及运行时间,请从以下选项中选出你认为正确的答案:
A.

import logging, sys
import datetime
def f(n):
    log.info('Computing up to %sth fibonacci number', n)
    a, b = 0, 1
    for n in range(n):
        a, b = b, a+b
        print(b, '', end='')
    print(b)
logging_file = 'log.txt'
logging.basicConfig(level=logging.WARN, filename=logging_file, format='%(asctime)s %(name)s %(levelname)s: %(message)s')
log = logging.getLogger(__name__)
if __name__ == '__main__':
    f(datetime.datetime.now().second)

B.

import logging, sys
import datetime
def f(n):
    log.info('Computing up to %sth fibonacci number', n)
    a, b = 0, 1
    for n in range(n):
        a, b = b, a+b
        print(b, '', end='')
    print(b)
logging_file = 'log.txt'
logging.basicConfig(level=logging.WARN, format='%(asctime)s %(name)s %(levelname)s: %(message)s')
log = logging.getLogger(__name__)
if __name__ == '__main__':
    f(datetime.datetime.now().second)

C.

import logging, sys
import datetime
def f(n):
    log.info('Computing up to %sth fibonacci number', n)
    a, b = 0, 1
    for n in range(n):
        a, b = b, a+b
        print(b, '', end='')
    print(b)
logging_file = 'log.txt'
logging.basicConfig(level=logging.INFO, filename=logging_file, format='%(asctime)s %(name)s %(levelname)s: %(message)s')
log = logging.getLogger(__name__)
if __name__ == '__main__':
    f(datetime.datetime.now().second)

D.

import logging, sys
import datetime
def f(n):
    a, b = 0, 1
    for n in range(n):
        a, b = b, a+b
        print(b, '', end='')
    print(b)
logging_file = 'log.txt'
logging.basicConfig(level=logging.INFO, filename=logging_file, format='%(asctime)s %(name)s %(levelname)s: %(message)s')
log = logging.getLogger(__name__)
if __name__ == '__main__':
    f(datetime.datetime.now().second)

正确答案: C

3. 第 3 题:命令行参数解析

知识点描述:编写命令行工具,根据提供给脚本的选项参数改变程序行为。
问题描述:编写命令行工具,根据提供给脚本的选项参数可以运行多个数据间的加/减/乘/除,请从以下选项中选出你认为正确的选项:
A.

import argparse
import operator
import logging
import functools
parser = argparse.ArgumentParser(description='Applies an operation to one or more numbers')
parser.add_argument("number", help="One or more numbers to perform an operation on.", type=int)
parser.add_argument('-o', '--operation', help="The operation to perform on numbers.", choices=['add', 'sub', 'mul', 'div'], default='add')
parser.add_argument("-v", "--verbose", action="store_true", help="increase output verbosity")
opts = parser.parse_args()
logging.basicConfig(level=logging.INFO if opts.verbose else logging.WARNING)
log = logging.getLogger()
operation = getattr(operator, opts.operation)
log.info('Applying %s to %s', opts.operation, opts.number)
print(functools.reduce(operation, opts.number))

B.

import argparse
import operator
import logging
import functools
parser = argparse.ArgumentParser(description='Applies an operation to one or more numbers')
parser.add_argument("number", help="One or more numbers to perform an operation on.", nargs='+')
parser.add_argument('-o', '--operation', help="The operation to perform on numbers.", choices=['add', 'sub', 'mul', 'div'], default='add')
parser.add_argument("-v", "--verbose", action="store_true", help="increase output verbosity")
opts = parser.parse_args()
logging.basicConfig(level=logging.INFO if opts.verbose else logging.WARNING)
log = logging.getLogger()
operation = getattr(operator, opts.operation)
log.info('Applying %s to %s', opts.operation, opts.number)
print(functools.reduce(operation, opts.number))

C.

import argparse
import operator
import logging
import functools
parser = argparse.ArgumentParser(description='Applies an operation to one or more numbers')
parser.add_argument("number", help="One or more numbers to perform an operation on.", nargs='2', type=int)
parser.add_argument('-o', '--operation', help="The operation to perform on numbers.", choices=['add', 'sub', 'mul', 'div'], default='add')
parser.add_argument("-v", "--verbose", action="store_true", help="increase output verbosity")
opts = parser.parse_args()
logging.basicConfig(level=logging.INFO if opts.verbose else logging.WARNING)
log = logging.getLogger()
operation = getattr(operator, opts.operation)
log.info('Applying %s to %s', opts.operation, opts.number)
print(functools.reduce(operation, opts.number))

D.

import argparse
import operator
import logging
import functools
parser = argparse.ArgumentParser(description='Applies an operation to one or more numbers')
parser.add_argument("number", help="One or more numbers to perform an operation on.", nargs='+', type=int)
parser.add_argument('-o', '--operation', help="The operation to perform on numbers.", choices=['add', 'sub', 'mul', 'div'], default='add')
parser.add_argument("-v", "--verbose", action="store_true", help="increase output verbosity")
opts = parser.parse_args()
logging.basicConfig(level=logging.INFO if opts.verbose else logging.WARNING)
log = logging.getLogger()
operation = getattr(operator, opts.operation)
log.info('Applying %s to %s', opts.operation, opts.number)
print(functools.reduce(operation, opts.number))

正确答案: D

4. 第 4 题:运行系统命令

知识点描述:在编写系统运维工具时,调用系统命令。

问题描述:编写 Linux 系统运维工具,调用系统命令查看 “/” 目录下文件,请从以下选项中选出你认为正确的选项:
A.

import shlex
import subprocess
def run(command):
    try:
        result = subprocess.getstatusoutput(command, shell=shlex.split(command), stderr=subprocess.STDOUT)
        return 0, result
    except subprocess.CalledProcessError as e:
        return e.returncode, e.output
status, out = run('ls "/"')
print(status, out)

B.

import shlex
import subprocess
def run(command):
    try:
        result = subprocess.check_output(command, shell=shlex.split(command), stderr=subprocess.STDOUT)
        return 0, result
    except subprocess.CalledProcessError as e:
        return e.returncode, e.output
status, out = run('ls "/"')
print(status, out)

C.

import gzip
text = 'text.txt'
with open(text, 'rt') as file:
    read_text = file.read()
    with gzip.open('compress.gz', 'wt', compresslevel = 9) as f:
        f.write(read_text)

D.

import gzip
text = 'text.txt'
with open(text, 'rt') as file:
    read_text = file.read()
    with gzip.open('compress.gz', 'wt', compresslevel = 0) as f:
        f.write(read_text)

正确答案:B

5. 第 5 题:命令行中进度条显示

知识点描述:使用进度条显示当前任务完成进度。
问题描述:在执行耗时任务时,使用进度条显示已经完成了的任务进度,请从以下选项中选出你认为正确的选项:
A.

import shutil, sys
import time
def progressbar(func):
    def _func_with_progress(*args, **kwargs):
        max_width, _ = shutil.get_terminal_size()
        gen = func(*args, **kwargs)
        while True:
            try:
                progress = next(gen)
            except StopIteration as exc:
                sys.stdout.write('\\n')
                return exc.value
            else:
                message = '[%s] {}%%'.format(progress)
                bar_width = max_width - len(message) + 3  
                filled = int(round(bar_width / 100.0 * progress))
                spaceleft = bar_width - filled
                bar = '=' * filled + ' ' * spaceleft
                sys.stdout.write((message+'\\r') % bar)
                sys.stdout.flush()
@progressbar
def wait(seconds):
    start = time.time()
    step = seconds / 100.
    for i in range(1, 101):
        time.sleep(step)
        yield i
    return time.time() - start
if __name__ == '__main__':
    print("Waiting", wait(4))

B.

import shutil, sys
import time
def progressbar(func):
    def _func_with_progress(*args, **kwargs):
        max_width, _ = shutil.get_terminal_size()
        gen = func(*args, **kwargs)
        while True:
            try:
                progress = next(gen)
            except StopIteration as exc:
                sys.stdout.write('\\n')
                return exc.value
            else:
                message = '[%s] {}%%'.format(progress)
                bar_width = max_width - len(message) + 3  
                filled = int(round(bar_width / 100.0 * progress))
                spaceleft = bar_width - filled
                bar = '=' * filled + ' ' * spaceleft
                sys.stdout.write((message+'\\r') % bar)
                sys.stdout.flush()
    return _func_with_progress
@progressbar
def wait(seconds):
    start = time.time(仅需6道题轻松掌握Python异常捕获 | Python技能树征题

仅需10道题轻松掌握Python文件处理 | Python技能树征题

仅需10道题轻松掌握Python字符串方法 | Python技能树征题

仅需6道题轻松掌握SciPy空间计算基础 | Python技能树征题

仅需8道题轻松掌握Python Web应用开发 | Python技能树征题

仅需10道题轻松掌握Matplotlib图形处理 | Python技能树征题