在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”不是一个有效的选项,这表明它现在正在挑选控制台参数。
答案 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)
如果是程序名称
,可能会删除第一项