在jupyter notebook/IPython中,unittest模块main函数运行出错的解决办法

python小白一枚,目前在跟着教材《Python入门到实践》学习。在jupyter notebook中运行第11章11.1.2节测试案例时,程序运行出错。程序name_function.py与测试程序test_name_function.py如下所示:

# name_function.py
def get_formatted_name(first,last):
    """Generate a neatly formatted full name."""
    full_name = first+' '+last
    return full_name.title()
# test_name_function.py
import unittest  
from name_function import get_formatted_name
class NamesTestCase(unittest.TestCase):
    """测试name_function.py"""
    def test_first_last_name(self):
        """能够正确地处理像Janis Joplin这样的姓名吗?"""
        formatted_name=get_formatted_name('janis','joplin')
        self.assertEqual(formatted_name,'Janis Joplin')   
   
unittest.main()

运行结果:一个AttributeError显示模块’__main__’中缺少某个与内核文件相关的属性,一个SystemExit显示值为True,后面还输出了一个Userwarning信息。

运行%td看到完整的SystemExit traceback信息:unittest.main()—>self.runTests()—>sys.exit()。

查询sys.exit()的用法,了解到sys.exit(n)退出程序引发SystemExit异常,可以捕获异常执行些清理工作。其中,n默认值为0,表示正常退出,其他都是非正常退出。这与SystemExit输出为True=1对应,sys.exit()处出现异常退出。

在百度上搜帖子,没有发现有效的方法。去github查询后找到了相同的问题帖,评论中给出了方案:给main()提供几个必要参数就可以解决问题,unittest.main(argv=['first-arg-is-ignored'],exit=False)。

关于在stackoverflow上的一个提问Unable to run unittest's main function in ipython/jupyter notebook中,参考答案给出了更详细的说明:

unittest.main默认查看sys.argv,这是启动IPython的内容,因此会出现内核连接文件不是有效属性的错误。可以将一个明确的列表传递给main,以避免查找sys.argv。在jupyter notebook中,还需要exit = False以防止unittest.main尝试关闭内核进程:unittest.main(argv=['first-arg-is-ignored'],exit=False)或unittest.main(argv=['ignored', '-v'], exit=False)。

使用unittest.main(argv=['ignored', '-v'], exit=False),结果如下:

最后附上提到的两个参考帖:

Github:https://github.com/jupyter/notebook/issues/2746

Stackwoverflow:https://stackoverflow.com/questions/37895781/unable-to-run-unittests-main-function-in-ipython-jupyter-notebook/38012249#38012249

 

  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值