Как напечатать инструкцию по использованию, когда аргументы не передаются?

#python #argparse

#python #argparse

Вопрос:

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

Комментарии:

1. Я не думаю, что единственной проблемой был вызов main() метода.

2. Что произойдет, если вы предоставите аргументы?

3. Модерам следует рассмотреть возможность открытия этого вопроса, чтобы можно было опубликовать существенные ответы, приветствия!

4. Как указано в OP, я добавил main() в свой собственный код, я просто забыл добавить его в этот вопрос. PS. Я мог бы опубликовать ответ, который, скорее всего, решил бы его проблему! 😀

5. Я все еще не печатаю инструкцию по использованию. Я просто ничего не получаю при запуске ‘./files.py ‘. Кроме того, я вызвал функцию main() в конце своего кода.

Ответ №1:

Вы никогда не запускаетесь 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()
  

Комментарии:

1. Я добавил main() в свой собственный код, я просто забыл добавить его в этот вопрос, но я все еще сталкиваюсь с той же проблемой, о которой я говорил выше.

2.Мой вывод…` ~ python3 test.py ` usage: test.py [-h] FILE test.py: error: the following arguments are required: FILE

3. @kevin Это поведение невозможно воспроизвести с помощью кода, который вы показали. Пожалуйста, предоставьте полный и проверяемый пример.

Ответ №2:

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

Ответ №3:

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

Комментарии:

1. У меня вызвана функция main(), но я по-прежнему ничего не получаю. Кроме того, я не хочу, чтобы он возвращал [-h], если это возможно.

2. @kevin С кодом, который вы разместили, отсутствует main , это единственная проблема. Мы не можем угадать, какие дополнительные части, которые вы не показали, создают другую проблему. Пожалуйста, отредактируйте свой вопрос, чтобы включить минимальный код, необходимый для воспроизведения вашей проблемы.

3. @kevin Возможно, вы упускаете ошибку, но в этом случае вы все равно должны получать ошибки из оболочки, пытаясь разобраться в вашем коде Python.