3.1.代码执行模式

予早 2024-10-05 22:39:14
Categories: Tags:

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.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!=0n=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为背景色