如何在未传递参数时打印用法语句



我正在传递一个名为 FILE 的单个位置参数字符串,但是当没有传递任何参数时,我希望它打印一个用法语句。

每次我在命令行中编写"./files.py"并且后面没有参数时,我的代码什么也不做。我做错了什么?

import argparse
import re
#--------------------------------------------------
def get_args():
    """get arguments"""
    parser = argparse.ArgumentParser(
        description='Create Python script',
        formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument('FILE', help='Pass a file', type=str)
    return parser.parse_args()
#--------------------------------------------------
def main():
    """main"""
    args = get_args()
    FILE = args.FILE.IGNORECASE()
    if len(args) != 1:
        print("Usage: files.py {}".format(FILE))
        sys.exit(1)
# --------------------------------------------------
if __name__ == '__main__':
    main()

预期成果:

$ ./files.py
Usage: files.py FILE

我得到的:

$./files.py
$

你从不跑main...

import argparse
import re
#--------------------------------------------------
def get_args():
    """get arguments"""
    parser = argparse.ArgumentParser(
        description='Create Python script',
        formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument('FILE', help='Pass a file', type=str)
return parser.parse_args()
#--------------------------------------------------
def main():
    """main"""
    args = get_args()
    FILE = args.FILE.IGNORECASE()
    if len(args) != 1:
        print("Usage: files.py {}".format(FILE))
        sys.exit(1)
main()

您需要定义代码的入口点。如果你想按照你所描述的(./files.py(来调用它,你需要像这样定义主入口点:

if __name__ == "__main__":
    """main"""
    args = get_args()
    FILE = args.FILE.IGNORECASE()
    if len(args) != 1:
        print("Usage: files.py {}".format(FILE))
        sys.exit(1)

你必须告诉你的操作系统,脚本必须由Python执行。添加 shebang 作为脚本的第一行:

#!/usr/bin/env python3
import argparse
...

否则,您必须使用 Python 显式执行脚本:

python3 ./files.py

必须调用 main 函数。一个好的地方是在脚本的末尾,保护仅在执行时运行:

if __name__ == '__main__':  # do not run on import
    main()

这给出了所需的输出:

$ python3 so_script.py
usage: so_script.py [-h] FILE
so_script.py: error: the following arguments are required: FILE

请注意,argparse已经为您创建了用法和帮助消息。无需自己创建它们。事实上,argparse会在运行您自己的使用情况信息之前结束您的脚本。

如果不想使用 -h 开关,请在创建参数分析器时传递add_help=False

parser = argparse.ArgumentParser(
    description='Create Python script',
    formatter_class=argparse.ArgumentDefaultsHelpFormatter,
    add_help=False,
)

最新更新