python:在给定列表上使用optparse而不是在系统命令行参数上

时间:2011-12-12 14:38:22

标签: python

在python应用程序的框架内,我需要调用几个主要使用optparse的脚本。他们都有这种形式的切入点:

if __name__ == '__main__':
    mains(sys.argv)

我刚刚调用了我的主函数mains,认为我的问题最初来自那里。然后,mains总是这样开始,例如:

def mains( argv ):
    parser = OptionParser()
    parser.add_option("-f", "--file", dest="filename", help="write result to FILE", metavar="FILE")
    parser.add_option("-x", "--filter", dest="filterset", help="filters", metavar="FILTERS")
    parser.add_option("-n", "--nameonly", dest="nameonly", help="nameonly", metavar="NAME_ONLY")
    parser.add_option("-z", "--ignorezeros", dest="ignorezeros", help="ignorezeros", metavar="IGNORE_ZEROS")
    parser.add_option("-y", "--xfilter", dest="xfilter", help="xfilter", metavar="X_FILTERS")

这里的argv没有被optparser使用,我找不到如何将它传递给它。从我的实际主要脚本,我以为我可以通过将参数作为列表传递来调用这些mains。显而易见,在当前状态下,子脚本总是会接收命令行...如何自己传递参数?

更新:我的脚本尝试对这些调用子脚本的调用是从控制台调用的:

start.py -df

问题:第一个下标的optparse告诉我“d”不是一个有效的选项,这表明它现在正在挑选控制台参数。

4 个答案:

答案 0 :(得分:3)

您遗漏了解析您的选项的电话:

parser.parse_args(argv)

parse_args采用一个可选参数,用于解析而不是sys.argv。

答案 1 :(得分:2)

虽然其他人已经回答了您的直接问题,但我强烈建议您将所有参数解析内容放在脚本的if __name__ == "__main__"部分而不是main()函数中。您的main()函数应该更像普通的Python函数。这样,如果你需要从另一个模块调用它,你不必假装argv并伪装你从命令行调用它。

答案 2 :(得分:1)

您将参数列表作为单个参数传递,您必须将mains定义为

def mains(*args):
    ...

而是通过

调用它
mains(*sys.argv)

答案 3 :(得分:1)

这是http://docs.python.org/library/optparse.html

的答案
  

(如果您愿意,可以将自定义参数列表传递给parse_args(),但这很少需要:默认情况下它使用sys.argv[1:]。)

而不是:

(options, args) = parser.parse_args()

做的:

(options, args) = parser.parse_args(argv)

如果是程序名称

,可能会删除第一项