Установить и потребовать сценарий Python по умолчанию OptionParser
Следующие операторы "parser.add_option" работают, но если скрипт выполняется без параметра /arg, он не будет жаловаться. Если опция / аргумент не указана, я бы хотел, чтобы по умолчанию отображалась справка (-h / --help).
usage = "usage: %prog [options] arg"
parser = OptionParser(usage)
parser.add_option('-d', '--directory',
action='store', dest='directory',
default=None, help='specify directory')
parser.add_option('-f', '--file',
action='store', dest='filename',
default=None, help='specify file')
parser.add_option('-v', '--version',
action="store_true", dest="show_version",
default=False, help='displays the version number')
(options, args) = parser.parse_args()
#if len(args) < 1:
# parser.error("incorrect number of arguments")
Во-вторых, если я включаю следующий фрагмент кода, то получаю "ошибка: неверное количество аргументов" даже при указании параметра / аргумента.
if len(args) < 1:
parser.error("incorrect number of arguments")
Благодарю.
Обновленный код с ошибкой трассировки ниже
def main():
usage = "usage: %prog [options] arg"
parser = OptionParser(usage)
parser.add_option('-d', '--directory',
action='store', dest='directory',
default=None, help='specify directory')
parser.add_option('-f', '--file',
action='store', dest='filename',
default=None, help='specify file')
parser.add_option('-v', '--version',
action="store_true", dest="show_version",
default=False, help='displays the version number')
if len(sys.argv) == 1:
parser.print_help()
sys.exit()
(options, args) = parser.parse_args()
#if options.show_version:
# prog = os.path.basename(sys.argv[0])
# version_str = "1.0"
# print "version is: %s %s" % (prog, version_str)
# sys.exit(0)
filenames_or_wildcards = []
# remove next line if you do not want allow to run the script without the -f -d
# option, but with arguments
filenames_or_wildcards = args # take all filenames passed in the command line
# if -f was specified add them (in current working directory)
if options.filename is not None:
filenames_or_wildcards.append(options.filename)
Проследить
$ python boto-backup.py Traceback (most recent call last): File "boto-backup.py", line 41, in <module>
filenames_or_wildcards = args # take all filenames passed in the command line NameError: name 'args' is not defined
1 ответ
Я бы сделал что-то вроде этого:
from optparse import OptionParser
import sys
def main():
usage = "usage: %prog [options] arg"
parser = OptionParser(usage)
parser.add_option('-d', '--directory',
action='store', dest='directory',
default=None, help='specify directory')
parser.add_option('-f', '--file',
action='store', dest='filename',
default=None, help='specify file')
parser.add_option('-v', '--version',
action="store_true", dest="show_version",
default=False, help='displays the version number')
if len(sys.argv) == 1:
parser.print_help()
sys.exit()
(options, args) = parser.parse_args()
# rest of program...
if __name__ == '__main__':
main()
Таким образом, мы настраиваем анализатор и параметры, а затем проверяем, был ли какой-либо ввод из командной строки.
Если нет, мы печатаем справочное сообщение и завершаем работу. В противном случае мы продолжаем выполнение программы.
При запуске без аргументов командной строки вывод:
Использование: your_script_name_here.py [options] arg Опции: -h, --help показать это справочное сообщение и выйти -d КАТАЛОГ, --directory= КАТАЛОГ указать каталог -f FILENAME, --file=FILENAME указать файл -v, --version отображает номер версии
Изменить (в ответ на обновленный код):
Пробел / отступ важен в Python.
Убедитесь, что остальная часть вашего кода имеет отступ, так что он принадлежит main()
функция.
От filenames_or_wildcards = []
ваш код выходит за рамки main()
функция и, следовательно, не имеет переменной с именем args
,