2013-06-03 5 views
1

Мне нравится разрабатывать внутри ноутбука ipython, но у меня возникает проблема, когда я хочу написать функцию main(), которая читает аргументы командной строки (например, с помощью OptionParser). Я хочу, чтобы иметь возможность экспортировать код в .py-файл и запустить его из командной строки, но я не нашел способ иметь main(), который работает как в ноутбуке с предопределенными аргументами, так и из командной строки с аргументами python и командной строки. В чем секрет?OptionParser в ноутбуке ipython?

В случае, если не понятно, я хотел бы сделать что-то вроде этого:

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: вернуть Ложные еще: вернуть 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 [options]». Вот почему я разместил этот вопрос. – user1427057

+0

Что произойдет, если вы передадите явный пустой список в 'parse_args()'? Я не знаком с ноутбуком 'ipython', но, возможно, есть проблема с доступом к' sys.argv'. Если это не имеет значения, я удалю этот ответ. – chepner

Смежные вопросы