python - новичок - интеграция optparse в программу - PullRequest
6 голосов
/ 23 марта 2012

Я начал серьезную попытку выучить некоторый Python как мой первый язык программирования с некоторыми базовыми знаниями об алгоритмах. Поскольку все рекомендуют, что лучший способ начать - это найти что-то полезное, я решил создать небольшой скрипт для управления моими репозиториями.

Основные вещи: - Включить / отключить YUM репозитории - Изменить приоритет в текущих репозиториях YUM - Добавить / Удалить репозитории

Хотя анализ файла и замена / добавление / удаление данных довольно просты, я борюсь (в основном с отсутствием знаний) с помощью optparse ... Я хочу добавить опцию (- l) в котором перечислены текущие доступные репозитории ... Я сделал простую функцию, которая выполняет эту работу (не очень сложную), но я не могу «связать» ее с «-l» в optparse. Кто-нибудь может предоставить примеры / предложения о том, как это сделать?

Текущий скрипт выглядит примерно так:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import sys
import optparse
import ConfigParse

repo_file = "/home/nmarques/my_repos.repo"

parser = optparse.OptionParser()
parser.add_option("-e", dest="repository", help="Enable YUM repository")
parser.add_option("-d", dest="repository", help="Disable YUM repository")
parser.add_option("-l", dest="list", help="Display list of repositories", action="store_true")
(options, args) = parser.parse_args()

def list_my_repos()
    # check if repository file exists, read repositories, print and exit
    if os.path.exists(repo_file):
        config = ConfigParser.RawConfigParser()
        config.read(repo_file)
        print "Found the following YUM repositories on " + os.path.basename(repo_file) + ":"
        for i in config.sections():
            print i
        sys.exit(0)
    # otherwise exit with code 4
    else:
        print "Main repository configuration (" + repo_file +") file not found!"
        sys.exit(4)

list_my_repos()

Любые предложения по улучшению (документы, примеры) приветствуются. Главная цель еще раз заключается в том, чтобы при выполнении script.py -l он мог запускать list_my_repos().

Ответы [ 3 ]

6 голосов
/ 23 марта 2012

Параметры парсинга с использованием optparse всегда были довольно непрозрачными для меня. Использование argparse немного помогает.

Я думаю, что понимание поможет в том, что модуль optparse на самом деле не помогает вам выполнять действия, указанные в командной строке. Скорее, он помогает вам собирать информацию из аргументов командной строки, которую вы можете использовать позже.

В этом случае собираемая вами информация хранится в кортеже (options, args) в вашей строке:

(options, args) = parser.parse_args()

Чтобы на самом деле действовать в соответствии с этой информацией, вам придется самостоятельно проверять свой код. Мне нравится помещать подобные вещи в блок в конце моей программы, , который будет запускаться, только если он вызывается из командной строки .

if __name__ == '__main__':
    if options.list:
        list_my_repos()

Чтобы немного понять, как это работает, полезно понять, что вы могли бы сделать то же самое без использования optparse, используя sys.argv.

import sys

if __name__ == '__main__':
    if sys.argv[1] == '-l':
        list_my_repos()

как вы, вероятно, можете видеть, однако, это будет очень хрупкая реализация. optparse / argparse дает вам возможность обрабатывать более сложные случаи, не слишком занимаясь собственным программированием.

5 голосов
/ 23 марта 2012

Во-первых, optparse docs говорят, что библиотека устарела, и вместо нее следует использовать argparse . Итак, давайте сделаем это:

import argparse

parser = argparse.ArgumentParser() #Basic setup
parser.add_argument('-l', action='store_true') #Tell the parser to look for "-l"
#The action='store_true' tells the parser to set the value to True if there's
#no value attached to it
args = parser.parse_args() #This gives us a list of all the arguments
#Passing the args -l will give you a namespace with "l" equal to True

if args.l: #If the -l argument is there
    print 'Do stuff!' #Go crazy

Удачи в изучении Python:)

3 голосов
/ 23 марта 2012

Вы не используете флаг -l в своем коде. Документация показывает, как проверить наличие флага. http://docs.python.org/library/optparse.html

(options, args) = parser.parse_args()
if options.list:
   list_my_repos()
   return
...