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

1 投票
2 回答
3555 浏览
提问于 2025-04-16 01:55
  • 我有一个用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 个回答

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.'
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()

撰写回答