Как напечатать оператор использования, если аргументы не переданы? - PullRequest
2 голосов
/ 02 апреля 2019

Я передаю одну строку позиционного аргумента, называемую 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
$

Ответы [ 3 ]

0 голосов
/ 02 апреля 2019

Вам необходимо определить точку входа вашего кода. Если вы хотите назвать это так, как вы описываете (./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)
0 голосов
/ 02 апреля 2019

Вы должны сообщить операционной системе, что скрипт должен выполняться 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,
)
0 голосов
/ 02 апреля 2019

Ты никогда не бежишь 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()
...