2016-02-06 48 views
1

我遇到了一個很奇怪的問題 - 當我使用argparser.add_argument()方法時,我得到ArgumentError()python:argparser.add_argument()cause ArgumentError()

from oauth2client.tools import argparser, run_flow 

if __name__ == "__main__": 
    argparser.add_argument("--videoid", default="L-oNKK1CrnU", 
    help="ID of video to like.") 

我正在與PDB代碼,這就是我得到的錯誤:

(Pdb) n 
ArgumentError: ArgumentError() 
> c:\py\googleapitest.py(48)<module>()->None 
-> help="ID of video to like.") 

這是根本原因:

C:\Python27\lib\argparse.pyc in _handle_conflict_error(self, action, conflicting_actions) 
    1452          for option_string, action 
    1453          in conflicting_actions]) 
-> 1454   raise ArgumentError(action, message % conflict_string) 

即使我遇到了錯誤如果我不通過「幫助」參數。

我在做什麼錯?

+0

什麼是'argparser'? – dm295

+0

@dm295 from oauth2client.tools import argparser – golosovsky

+0

這將有助於瞭解如何定義'argparser'。它會出現一個名爲'--videoid'的選項。 – chepner

回答

2

auth2 docs

The oauth2client.tools.run_flow() function is controlled by command-line flags, and the Python standard library argparse module must be initialized at the start of your program. Argparse is included in Python 2.7+, and is available as a separate package for older versions. The following shows an example of how to use this function:

import argparse 
from oauth2client import tools 

parser = argparse.ArgumentParser(parents=[tools.argparser]) 
flags = parser.parse_args() 

死而復生

在某些環境(如pdb)中重新啓動腳本後出現原始問題。重新啓動時,主腳本將再次運行,但舊的導入腳本仍會保留,其中包括對oath2client.tools.argparser的更改。解決方案如文檔中所述,使用oauth2client的解析器作爲父項創建您自己的解析器。這樣,您只需將您的參數添加到在啓動時重新創建的解析器。

+0

雖然OP不遵循文檔,你的回答並沒有真正解決他的問題 - 當在'argparser'上調用'argparse.ArgumentParser.add_argument'時出錯,原則上這應該是可能的。 – werkritter

+0

@werkritter我已按照Google指南上的說明進行操作 - https://developers.google.com/youtube/v3/code_samples/python#rate__like__a_video – golosovsky

+0

@werkritter我仔細查看了源代碼,並且您是對的。這不會解決問題!我會刪除它。 – tdelaney

1

您必須初始化解析器。我只是做這個(我認爲oauth.tools真的鏈接到argparse反正):

import argparse 

def main(args): 
    pass 
    #reference args.videoid to use in the code 

if __name__ == "__main__": 
    parser = argparse.ArgumentParser() 
    parser.add_argument("--videoid", dest='videoid',default="L-oNKK1CrnU", help="ID of video to like.") 
    args = parser.parse_args() 
    main(args) 
+1

由於OP的第三個代碼清單顯示,argparser確實使用了stdlib中的argparse。另一個證明:https://github.com/google/oauth2client/blob/master/oauth2client/tools.py#L51。因此,在使用oauth2client.tools.argparser時,不需要初始化解析器。 – werkritter

+1

這不太對。您需要添加宣誓argparser作爲父項,以將其選項添加到您的命令行中。 – tdelaney

+1

那麼,雖然這可能不是一個好習慣,但我不明白爲什麼原則上不能直接使用'argparser'。只有當你需要創建比解析器更多的解析器時,纔會有問題,其中每個解析器都需要'argparser'作爲父解析器。 – werkritter

相關問題