从使用命令行选项解析的Python脚本中启动ipython shell
我找了很久想要找到一个最佳的方法来解决这个问题,但一直没有成功。我的问题设置如下:
我想在一个使用命令行选项解析的 Python 脚本中,从内部启动一个 ipython 终端来进行调试,而不是通过编程的方式。
为了说明这个问题,我下面有一些示例代码:
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
【重新发布作为答案,因为这个方法有效】
试着这样指定参数:IPShellEmbed(argv=[])()
。这样做可以阻止IPython去查看你给脚本传递的那些参数。