开发者学堂课程【面向运维的 python 脚本速成 -1024程序员节创造营公益课:Python DAY 3 作业评审&发布 PYPI】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/895/detail/14307
Python DAY 3 作业评审&发布 PYPI
目录:
一、 Python 脚本的问题
二、 常用的 Python 命令行编写工具
三、 Click
四、 Click 快速开始
五、 Click 定义可选选项 Option
六、 Click 定义参数 Argument
七、 Click 输出彩色字体
八、 Click 分页
九、 Click 显示进度条
十、 为什么要将命令行工具发布至 Pypi
十一、 作业评审
一、Python 脚本的问题
1.用户需要手动安装依赖
如果脚本写的非常复杂,安装将会非常麻烦,分发非常不妨便
2.涉及到多个脚本,需要手动分发多个脚本,维护非常麻烦
自己写的脚本不能实现子命令
3.脚本对于环境的一致性要求比较高,分发时需要确保环境一致
4.脚本不放置在系统路径中,需要使用完整路径调用
5.脚本无法配置子命令,使用起来比较麻烦
6.脚本需要自行维护参数 args
7.脚本没有提供原生的帮助信息,长期维护成本高
二、常用的 Python 命令行编写工具
1.cement
2.Click
Click 是 Flask 的团队 pallets 开发的优秀开源项目,它为命令行工具的开发封装了大量方法,使开发者只需要专注于功能实现。
案例:
# hello.py
import click
@click.command()
@click.option('--count', default=1, help='Number of greetings.')
@click.option('--name', prompt='Your name',help='The person to greet.')
def hello(count, name):
"""Simple program that greets NAME for a total of COUNT times."""
for x in range(count):
click.echo('Hello %s!' % name)
if __name__ == '__main__':
hello()
3.cliff
4.docopt
5.python-fire
6.python-prompt-toolkit
三、Click
•click 是一个以尽可能少的代码、以组合的方式创建优美的命令行程序的 Python 包。它有很高的可配置性,同时也能开箱即用。
•Click 具备以下三个特性
•任意嵌套命令
•自动生成帮助
•支持运行时坚持加载子命令
帮助我们在写代码时可以非常方便的命令,而且提供了很多的装饰器
四、Click 快速开始
首先我们需要安装 click
import click-
#通过 click 注册一个新的 click
@click. command()-
def hello():-
click. echo( 'Hello WorLd!') -
if __name__ = ‘__main__’
hello()
(venv )-click python hello.py
Hello Wor
ld!
实验1:
首先创建一个文件:
M
kdir
click.
py
T
ouch
click.
py
输入内容:
import click-
#通过 click 注册一个新的 click
@click. command()-
def hello():-
click. echo( 'Hello WorLd!') -
if __name__ = ‘__main__’
hello()
然后保存输入 python hello.py 运行脚本
得到结果:Hello World!
用 click 实现昨天的脚本前函数部分:
import click
@click. command()
def help
(
):
click. echoC"hello world")
@click. commandO)
def info():
click. echo("info")
@click. command()
def ip():
click. echo("info")
@click. command()
def name() :
click. echoC"info")
@click. commandO)
def run():
click. echo("info")
if_ name__
=
=’___main___’
五、Click 定义可选选项 Option
•在 Click 中,可以使用 click.option 来定义选项
•option 中设置 default 为默认选项
•option 中设置 help 为 帮助信息
•option 设置 type 为数据类型
•option 设置 hide_input 可以隐藏输入
•option 设置 confirmation_prompt 可以验证输入
•option 设置 nargs 表示接受多个值
案例:
@cLick . command()
@cLick .option(--name', prompte='Your name’.Help=’the person to greet.’
def hello(count, name):
# comand code
这是一个可选项的输入
最常用的:@click.
options(“--forcce”)
六、Click 定义参数 Argument
•在 Click 中,可以使用 click.argument 来定义参数
•argument 设置 nargs 表示接受多个值
•argument 设置 type 设定格式
•argument 设置 type 为 click.File 支持对文件操作
@click . command( )
@cLick . argument( ' input', type=click.File('rb'))
@click . argument( ' output',type=click.File('wb' ))
def inout( input, output) :
while True:
chunk = input .read(1024 )
if not chunk:
break
output . write ( chunk)
七、Click 输出彩色字体
调整输出结果:
•Click 内置了输出颜色的功能,开发者可以很轻松的完成对文字进行美化,从而提升输出内容的醒目程度
cLick . echo(click.styLe( 'Hello World!', fg=' green'))
click. echo(click.styLe('Some more text', bg='btue', fg=' white'))
click. echo(click.styLeC'ATTENTION', bLink=True, bold=True))
| click. secho('HeLlo World!', fg=' green' )
click. secho('Some more text', bg='blue', fg= 'white')
click. secho( ' ATTENTION ', bLink=True, bold=True )
八、Click 分页
•Click 内置了分页内容的支持,你可以十分方便的完成内容的分页展示;对于内容特别大的,可以使用迭代器来实现
@click. comand()
def Less():
click.echo_via_pager(“\n”.join(f”Line {idx}" for idx in range
(200)))
def generate output():
for idx in range (50000):
yield f"Line {idx}\n"
aclick。command()
def Less() :
click.echo _via_ pager(_ generate . output() )
九、Click 显示进度条
•Click 提供了一个进度条的功能,在处理大量文件时,可以快速实现一个简单的进度条
Import time
import
cl
ick
all_the_ users._to_ process . ['a', 'b','c']-
def modify_ the_ user(user):-
time.sLeep(0.5)-
with click. progressbar (all_the._users_to_process) as bar:-
for user in bar :
nodify_the_user(user)
import t ime
import click
all_the_ users. to. procuss . ['a', b','e']-
def modify_ the. user(user);-
time. sleep(0.5)-
with cLick ,progressbar(a1l_ the. users. to. process) as bar:-
for user in enumerate(all_the users_ to. process):-
nodify_the_user(user)-
bar.update (1)
十、为什么要将命令行工具发布至 Pypi
•更容易被分发:使用时通过 Pypi 安装即可
•无需关注执行环境:如果可以通过 Pip 安装,则说明相应环境已经齐备,无需在代码中检测
如何发布 pypi:
在 setup.py, setup.cfg 中定义包的基本信息
最核心的是setup函数
setup(
#包名
name= ' bestony-test-package
‘,
#版本号
version="1.0.0"
,
#作者名
author="bestony" ,
#邮箱
author_ email= ' bestony@Linux. com '
#基本介绍
description= "bestony test '
#长介绍支持 text 文件和 markdown 文件
markdown 文件文件内容:
# test
## command
1. python3 setup.py sdist
2. pip install twine -U
3. twine upLoad -- repository testpypi dist/*
4. twine upload pypi dist/*
Long_ description=long_ description,
Long_ description_ .content. .type= 'text/ markdown '
#分类器
classifiers= [
' DeveLopment Status :: 4一Beta' ,
Programming Language :: Python :: 3'
#省略一下
],
#确认发哪个文件
packages=find_ .packages(),
#包需要什么版本的 python
python_ requires='≥3.5'
#需要依赖哪些软件包
install_ requires= [],
#地址信息
project_ urls={
'Source': ' https :// github. com/bestony/xxx
},
# entry. _points={
#"console_ scripts": [
#"bestony=source : main”
#]
# },
)
打包文件:
python3 setup.py sdist
安装twine 包:
pip install twine -U
上传:需要先在 pypi.com 注册一个账号
twine upLoad -- repository testpypi dist/*
发布时需要用户名和密码,注意要在登录状态
十一、作业评审
注意:
l 如果在脚本文件中引入了全新的包,要提醒使用人进行安装
可以在文件开头这样标明
# -*- coding: utf-8 -*-
@Time :2021/11/3 8:52
@Auth :
班纳
.
@File:Learning- .day02. py
@IDE
:
PyCharm
@Motto: guting(Always Be Coding)
l 在 python 文件中,格式问题非常重要,一个空格或缩进将决定代码是否能被运行
l 注意自己写的代码是什么意思,是否有基础错误,可以适当多写点注释,这样可以让自己可以一眼看出什意思,别人也能轻易读懂你写的代码
l 可以把包放在一行进行引入
import os
,
sys,time, socket
,
platform
l Python 多行语法
def info():
info_ msg = f”””
PLatform: {platform. pLatform()}
Version: {pLatform . versionC}
System: {platform. system()}
“””
print(info_ msg)
l Python多层嵌套,是否确认环节
def exec_ .shell(cmd ,pars):
#本函数可能引入注入攻击
if(cmd =="pip install"):
os.systemC"pip install “+ pars)
else:
print( "The command is not our standard command: ”, cmd,
x=input("Do you know what your are doning?(y/n)")
if( x == "y"):
x=input("You Really Want to Excute the Command?(y/ n)")
if( x == "y"):
os. system(cmd +””+ pars)
else:
print("You did NOT excuted the command" )
exit( 1 )
e
l
se:
print("You did NOT excuted the command")
exit(1)
l Python eval 函数使用
#获取服务器信息
#func_ .name 方法名
def exe_ .platform(func_ _name):
if(func_ name ==
“
"):
print("exe_ platform方法缺失第二个参数(platform的方法名称)")
exit( )
print("result:”,
eval(' platf
orm. '+func_ name+'() ')
可以做一个预设如果没有输入内容将会输出什么,因为你不知道别人是如何使用你的脚本的
l 脚本开始时一个标明命令内容,多写帮助命令,方便用户使用