我开始认真学习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()
。
答案 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