我一直在寻找一段时间找到最佳方法,但没有成功。我的问题设置如下:
我希望能够在一个使用命令行选项解析(optparse
)的python脚本中以非编程方式启动ipython shell以进行调试。
为了说明这个问题,我有一些示例代码:
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获得的功能丰富,以及因为它会更好,所以我更喜欢按照我建议的方式进行操作很高兴知道为什么我的方式不起作用。
答案 0 :(得分:4)
[因为它起作用而重新作为答案]
尝试指定argv,如下所示:IPShellEmbed(argv=[])()
。这应该阻止IPython查看你给脚本的参数。