Запустите оболочку ipython из скрипта python, который использует синтаксический анализ параметров командной строки - PullRequest
1 голос
/ 25 мая 2011

Я довольно долго искала способ найти оптимальное решение, но не увенчалась успехом. Моя проблема заключается в следующем:

Я хочу иметь возможность запускать оболочку ipython для целей отладки из скрипта python, который использует синтаксический анализ параметров командной строки (optparse), непрограммным способом .

Чтобы проиллюстрировать проблему, у меня есть пример кода ниже:

import sys
from optparse import OptionParser

class toolRunner(object):

    def __init__(self):
        self._parseOptions()

    def _parseOptions(self):
        usage = "Usage: %prog [--help] [options] input.cmp.h5" 
        parser = OptionParser(usage=usage)
        parser.add_option('-r', type='string', dest='ins', default='1,2,3,4')
        self.opts, args = parser.parse_args()

    def main(self):
        print testSum(self.opts.ins)

def testSum(dstr):
    from IPython.Shell import IPShellEmbed; IPShellEmbed()()
    return sum(map(int,dstr.strip().split(',')))

if __name__ == '__main__':
    sys.exit(toolRunner().main())

Если я сейчас назову свой тестовый скрипт test.py следующим образом:

python test.py -r 1,2,3,4

Я получаю следующую ошибку:

WARNING:
Error in Arguments: "Ambiguous option '-r';  matches ['readline', 'readline_merge_completions', 'readline_omit__names', 'rcfile']"

Я полагаю, что ipython пытается интерпретировать параметр командной строки -r как предназначенный для него. Если я вместо этого вызываю функцию testSum(dstr) программно, то такая ошибка не генерируется, и я получаю всплывающую оболочку ipython. То есть, если я подставлю следующий код в приведенном выше примере:

if __name__ == '__main__':
    # sys.exit(toolRunner().main())
    testSum('1,2,3,4')

И запустите мой скрипт как:

python test.py -r 1,2,3,4

все работает хорошо.

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

1 Ответ

4 голосов
/ 25 мая 2011

[Повторная отправка в качестве ответа, поскольку он работал]

Попробуйте указать argv, например: IPShellEmbed(argv=[])().Это должно помешать IPython просматривать аргументы, которые вы указали в своем скрипте.

...