python - 初学者 - 在程序中集成optparse

时间:2012-03-23 19:05:03

标签: python optparse

我开始认真学习Python作为我的第一门编程语言,并掌握一些算法基础知识。由于每个人都建议最好的方法是找到有用的东西,我决定用一个小脚本来管理我的存储库。

基本的东西:   - 启用/禁用YUM存储库   - 更改当前YUM存储库的优先级   - 添加/删除存储库

虽然解析文件并替换/添加/删除数据非常简单,但我正在努力(主要是因为可能缺乏知识)与'optparse'的单一事物......我想添加一个选项( - l)列出了当前可用的存储库......我已经创建了一个简单的函数来完成这项工作(不是非常详细的),但是我无法将它与optparse上的'-l'连接起来。任何人都可以提供关于如何制作这个的例子/建议吗?

当前脚本是这样的:

#!/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 个答案:

答案 0 :(得分:6)

使用optparse解析选项对我来说一直是不透明的。使用argparse会有所帮助。

我认为有用的见解是optparse模块实际上并不能帮助您执行命令行中指定的操作。相反,它可以帮助您从命令行参数中收集信息,以后可以对其进行操作。

在这种情况下,您收集的信息存储在您的行中的元组(options, args)中:

(options, args) = parser.parse_args()

要真正对此信息采取行动,您必须自己检查代码。我喜欢在程序结束时将这样的事情放在一个块中which will only run if it is called from the command line

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

通过使用sys.argv来了解如何更清楚地工作,有助于意识到你可以在没有optparse的情况下做同样的事情。

import sys

if __name__ == '__main__':
    if sys.argv[1] == '-l':
        list_my_repos()
但是,你可能会看到,这将是一个非常脆弱的实现。 optparse / argparse可以帮助你处理更复杂的案例而不需要做太多自己的编程。

答案 1 :(得分:5)

首先,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的好运:)

答案 2 :(得分:3)

您没有在代码中使用-l标志。该文档显示如何检查标志是否存在。 http://docs.python.org/library/optparse.html

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