脚本作为模块和可执行文件
我有一个用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()