我一直在寻找相当一段时间来找到一种方法来优化这个,但一直没有成功。我的问题设置如下:从使用命令行选项解析的python脚本启动ipython shell
我希望能够启动一个IPython的外壳从使用命令行选项解析(optparse
),在非程序化的方式 python脚本内调试。
为了说明这个问题,我有波纹管一些示例代码:
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 shell弹出。也就是说,如果我在上面的例子中替换下面的代码:
if __name__ == '__main__':
# sys.exit(toolRunner().main())
testSum('1,2,3,4')
和运行我的脚本:
python test.py -r 1,2,3,4
一切运行良好。
我已经研究过替代方案,即使用ipdb(Is it possible to go into ipython from code?),但宁愿这样做,因为我从ipython shell获得的丰富功能以及因为它会很高兴知道为什么我的方式不起作用。
没有测试过这个,但是:尝试指定argv,就像这样:'IPShellEmbed(argv = [])()'。这应该阻止IPython查看您给脚本的参数。 – 2011-05-25 11:58:52
不错,它的工作!可能想发布这个答案。 – diliop 2011-05-25 17:12:51
非常好。我已经发布了它作为答案。 – 2011-05-25 18:18:47