Python代码执行模式分为交互模式、脚本模式、模块模式
交互模式
执行python进入交互模式再输入代码执行
脚本模式
# sys.path
bash task/code.py
python task/code.py
模块模式
python -m task.code.py
命令行参数
命令行参数解析
sys.argv
# python demo.py 8 64
import sys
file = sys.argv[0]
gpus = sys.argv[1]
batch_size = sys.argv[2]
print(file, gpus, batch_size) # demo.py 8 64
getopt
C语言风格命令行参数,Python标准库
argparse
命令行参数解析,Python标准库
# python demo.py --gpus 12 --batch_size 1
import argparse
parser = argparse.ArgumentParser(description='assign gpus and batch size')
parser.add_argument("--gpus", type=str, default="0")
parser.add_argument("--batch_size", type=int, default=32)
args = parser.parse_args()
print(args) # Namespace(gpus='12', batch_size=1)
print(args.gpus) # 12
print(args.batch_size) # 1
click
三方库,click相比于argparse,就类似requests相比于urllib
@click.command()装饰函数使其可接受命令行参数@click.argument(),添加位置参数,python demo.py a b c@click.option(),添加选项参数,python demo.py --name zh --age 18
click.argument
基本示例
import click
@click.command()
@click.argument('x')
@click.argument('y')
@click.argument('z')
def show(x, y, z):
click.echo('x: %s, y: %s, z: %s' % (x, y, z))
if __name__ == '__main__':
show()
# python demo.py 1 2 3
不定参数
import click
@click.command()
@click.argument('args', nargs=-1)
@click.argument('a', nargs=1)
@click.argument('b', nargs=2)
def move(a, b, args):
click.echo("a: %s, b: %s, args: %s" % (a, b, args)) # a: 3, b: ('4', '5'), args: ('1', '2')
if __name__ == '__main__':
move()
# python demo.py 1 2 3 4 5
nargs=-n表示参数传入值个数,n=-1表示参数为可变参数,以元组形式传入,n!=0,n=1表示传入一个参数值,n>1表示取传入n个参数值,以元组形式传入
click.option
基本示例
import click
@click.command()
@click.option('--rate', default=12, type=float, help='rate')
def show(rate):
click.echo('rate: %s' % rate) # rate: 10.0
if __name__ == '__main__':
show()
# python demo.py --rate 10
可选值参数
import click
@click.command()
@click.option('--gender', type=click.Choice(['male', 'female'])) # 限定值
def choose(gender):
click.echo('gender: %s' % gender) # gender: male
if __name__ == '__main__':
choose()
# python demo.py --gender male
多值参数
import click
@click.command()
@click.option('--center', nargs=2, type=float, help='center of the circle')
@click.option('--radius', type=float, help='radius of the circle')
def circle(center, radius):
click.echo('center: %s, radius: %s' % (center, radius)) # center: (1.0, 1.0), radius: 3.0
if __name__ == '__main__':
circle()
# python demo.py --center 1 1 --radius 3
密码
import click
@click.command()
@click.option('--password', prompt=True, hide_input=True, confirmation_prompt=True)
def input_password(password):
click.echo('password: %s' % password)
if __name__ == '__main__':
input_password()
# python demo.py
回调
import click
def print_version(ctx, param, value):
if not value or ctx.resilient_parsing:
return
click.echo('version 1.0')
# ctx.exit() # 若直接在此处退出上下文则不会执行后续操作
@click.command()
@click.option('--version',
is_flag=True, # 是否为标记参数,标记参数不支持传值
callback=print_version,
expose_value=False, # 是否暴露参数值
is_eager=True)
@click.option('--name', default='World', help='name', expose_value=True)
def hello(name):
click.echo('Hello %s!' % name)
if __name__ == '__main__':
hello()
# python demo.py --version --name W
click.secho
import click
@click.command()
@click.option('--name', help='A name.')
def hello(name):
click.secho('Hello %s!' % name)
click.secho('Hello %s!' % name, fg='yellow', bg='black')
click.secho('Hello %s!' % name, fg='red', underline=True, bold=True)
if __name__ == '__main__':
hello()
# python demo.py --name World
fg为前景色(字体颜色),bg为背景色