脚本作为模块和可执行文件

时间:2010-07-27 21:12:23

标签: python

  • 我在python中有一个脚本,可以从命令行调用并使用optparse

    script -i arg1 -j arg2
    

    在这种情况下,我使用(options, args) = parser.parse_args()创建options,然后使用options.arg1来获取参数。

  • 但我也希望它可以作为模块导入。

    from script import *
    function(arg1=arg1, arg2=arg2)
    

    我设法使用一个非常蹩脚的解决方案:提供虚拟对象。

    def main():
        class Options:
            ''' dummy object '''
            def __init__(self):
                pass
        options = Options
        for k in kwargs:
            setattr(options, k, kwargs[k])
    

脚本的其余部分并不知道差异,但我认为这个解决方案很难看。

有更好的解决方案吗?

2 个答案:

答案 0 :(得分:6)

将CLI与主力类分开:

class Main(object):
    def __init__(self,arg1,arg2):
        ...
    def run(self):
        pass

if __name__=='__main__':
    import optparse
    class CLI(object):
        def parse_options(self):
            usage = 'usage: %prog [options]'+__usage__
            parser = optparse.OptionParser(usage=usage)
            parser.add_option('-i', dest='arg1')
            parser.add_option('-j', dest='arg2') 
            (self.opt, self.args) = parser.parse_args()
        def run(self):
            self.parse_options()        
            Main(self.opt.arg1,self.opt.arg2).run()
    CLI().run()

答案 1 :(得分:2)

您通常做的是:

def foo():
    print 'This is available when imported as a module.'

if __name__ == '__main__':
    print 'This is executed when run as script, but not when imported.'