2010-07-27 37 views
1
  • 我有一個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]) 
    

腳本的其餘部分不知道其中的差別,但我認爲這種解決方案的fugly。

有沒有更好的解決方案呢?

+3

'對於k在** kwargs:'?你能粘貼你使用的實際代碼嗎? – 2010-07-27 21:25:23

+1

這實際上不是一個壞的解決方案。儘管只是FYI,但您可以刪除__init__,並且只有「class Options:pass」。我經常想知道爲什麼Python沒有帶一個內置的「空類」來讓你設置它的任何屬性,就像你不能用普通的'object()'做的那樣。 – 2010-07-27 21:29:18

回答

5

單獨從主力類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() 
+0

聽起來像一個計劃。謝謝。 – 2010-07-27 21:32:27

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.' 
相關問題