我在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])
脚本的其余部分并不知道差异,但我认为这个解决方案很难看。
有更好的解决方案吗?
答案 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.'