2013-06-03 175 views
1

我很喜歡在ipython筆記本里面開發,但是當我想寫一個main()函數來讀取命令行參數(例如OptionParser)時,我遇到了一個問題。我希望能夠將代碼導出到.py文件並從命令行運行它,但是我還沒有找到一種方法來讓main()在筆記本中使用預定義的參數或從命令行運行與python和命令行參數。什麼祕密?ipython筆記本中的OptionParser?

在這種不明確的情況下,我願做這樣的事情:

if __name__ == '__main__': 
    # if in the notebook 
    vals = {'debug':True, 'tag_file': 't.tags'} 
    options = Object() 
    for k,v in vals.items(): 
     options.setattr(k,v) 
    args = 'fname1.txt' 
    # if running as a command line python script 
    from optparse import OptionParser 
    parser = OptionParser() 
    parser.add_option('-d','--debug',action='store_true',dest='debug') 
    parser.add_option('-t','--tags',action='store',dest='tag_file') 
    options,args = parser.parse_args() 

回答

1

你不能確定你是在IPython的筆記本電腦或qtconsole,或簡單IPython的外殼,很簡單因爲3可以同時連接到同一個內核。

這就像是問,用戶輸入的當前鍵的顏色是什麼。您可以通過查看插入的USB設備並在互聯網上查找圖像並猜測鍵盤顏色來獲得它,但沒有什麼可以保證它是準確的,也不會改變,用戶可以插入多個鍵盤,甚至可以插入多個鍵盤彩繪鍵盤。

它與筆記本電腦是一樣的,即使你確定你在ZMQKernel中,你是在向qtconsole還是網絡服務器求助?再一次,你發現你正在和網絡服務器通話,你在和JS還是Emacs交談?等等等等。

你可以做的唯一的事情,你可以問用戶。

什麼是可靠的,是測試你是否在IPython中。


如果你真的reeaaalllyy想辦法,因爲到現在爲止,筆記本電腦是可以顯示JavaScript中的唯一的事情。 JavaScript可以在pyton中執行代碼。所以你可能能夠創建顯示JS的東西,將信息發送回內核。並且使用線程和計時器,你可以說你不在筆記本中(但你會有競爭狀態)。

+0

我確定。如何測試我是否在IPython中?在命令行運行時,我將使用python,而不是ipython。 – user1427057

+0

謝謝,鑑於此提示,我通過編寫in_ipython()函數(從stackoverflow文章)找到答案。我在這裏重新發布代碼:直列'高清in_ipython(): 嘗試: __IPYTHON__ 除了NameError: 返回False 其他: 返回TRUE; – user1427057

0

不要擔心區別。只需設置默認值,並且除非從命令行覆蓋它們,否則使用這些值。

if __name__ == '__main__': 

    parser = OptionParser() 
    parser.add_option('-d', '--debug', action='store_true', dest='debug', 
         default=True) 
    parser.add_option('-t','--tags',action='store',dest='tag_file', 
         default='t.tags') 
    options, args = parser.parse_args() 
    if not args: 
     args = ['fname1.txt'] 
+1

parser.parse_args()從IPython的筆記本採用了SystemExit中運行時失敗: 2和「用法:-c [選項]」消息。這就是我發佈這個問題的原因。 – user1427057

+0

如果將明確的空列表傳遞給'parse_args()',會發生什麼?我不熟悉'ipython'筆記本,但是訪問'sys.argv'可能只是一個問題。如果這沒什麼區別,我會刪除這個答案。 – chepner