Я довольно долго искала способ найти оптимальное решение, но не увенчалась успехом. Моя проблема заключается в следующем:
Я хочу иметь возможность запускать оболочку 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, а также потому, что было бы неплохо узнать, почему мой путь не работает.