允许使用命令行参数自定义模块/包,而不会干扰其用户

时间:2013-04-09 01:38:07

标签: python argparse python-3.3

我很好奇我将如何在python中执行此操作。想象一下,我有一个模块spam.py,我想用-‍-‍spam_more选项来控制垃圾邮件。

如何使用argparse或其他一些解析库,在使用垃圾邮件模块时,仍然允许主ham.py文件可选地使用命令行参数。?

1 个答案:

答案 0 :(得分:1)

您可以将参数处理内容放在“if __name__ == "__main__":”内if块内的任何代码只会在从命令行运行脚本时运行,或者不运行,但如果是导入则不会运行作为一个模块。例如在命令行中键入$ python spam.py将导致块被执行。

以下是使用optparse的示例(因为之前我没有使用过argparse):

spam.py:

def do_stuff(spammy=False):
    if spammy:
        print "wow, this is spammy."
    else:
        print "i've seen spammier."

if __name__ == "__main__":
    from optparse import OptionParser

    p = OptionParser()
    p.add_option("--spam_more", action="store_true", dest="spammy")
    (options, args) = p.parse_args()

    do_stuff(options.spammy)

ham.py:

import spam
# do optparse stuff...

spam.do_stuff()

当您在spam.py上使用--spam_more时,spammy将设置为True。但是ham.py对此一无所知,并且可以使用它自己的optparse东西以及使用垃圾邮件的功能do_stuff(),因为当将spam.py作为模块导入时,“if __name__ == "__main__":”内的代码永远不会运行

import语句放在if块中可能是不好的做法,但这似乎是最好的方法。