2011-05-25 25 views
1

我一直在寻找相当一段时间来找到一种方法来优化这个,但一直没有成功。我的问题设置如下:从使用命令行选项解析的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获得的丰富功能以及因为它会很高兴知道为什么我的方式不起作用。

+1

没有测试过这个,但是:尝试指定argv,就像这样:'IPShellEmbed(argv = [])()'。这应该阻止IPython查看您给脚本的参数。 – 2011-05-25 11:58:52

+0

不错,它的工作!可能想发布这个答案。 – diliop 2011-05-25 17:12:51

+0

非常好。我已经发布了它作为答案。 – 2011-05-25 18:18:47

回答

4

[转贴作为一个答案,因为它的工作]

尝试指定的argv,像这样:IPShellEmbed(argv=[])()。这应该阻止IPython查看您给脚本的参数。