在 iPy Notebook 中运行 unittest 示例时出现 AttributeError

Posted

技术标签:

【中文标题】在 iPy Notebook 中运行 unittest 示例时出现 AttributeError【英文标题】:AttributeError when running unittest sample in iPy Notebook 【发布时间】:2014-07-28 21:48:50 【问题描述】:

我是 iPython 的新手,正在尝试帮助其他开发人员入门,但我们都遇到了同样的问题。

我们正在尝试从https://docs.python.org/2/library/unittest.html#basic-example 在 iPython 中运行 python unittest 示例 该代码在 Windows 和 ubuntu 上的命令行运行良好,无需任何修改 与 iPy 笔记本完全相同的代码会生成以下异常:

AttributeError: 'module' object has no attribute '/home/myuser/'

文件名为:/home/myuser/example_unittest.ipynb

到目前为止,我已经浏览了 iPython 文档和谷歌,但没有运气。任何调试提示或解决此问题的线索都值得赞赏。

(全栈):

AttributeError                            Traceback (most recent call last)
<ipython-input-2-39bc0ec16f11> in <module>()
     28 
     29 if __name__ == '__main__':
---> 30     unittest.main()
     31 

/usr/lib/python2.7/unittest/main.pyc in __init__(self, module, defaultTest, argv, testRunner, testLoader, exit, verbosity, failfast, catchbreak, buffer)
     92         self.testLoader = testLoader
     93         self.progName = os.path.basename(argv[0])
---> 94         self.parseArgs(argv)
     95         self.runTests()
     96 

/usr/lib/python2.7/unittest/main.pyc in parseArgs(self, argv)
    147             else:
    148                 self.testNames = (self.defaultTest,)
--> 149             self.createTests()
    150         except getopt.error, msg:
    151             self.usageExit(msg)

/usr/lib/python2.7/unittest/main.pyc in createTests(self)
    156         else:
    157             self.test = self.testLoader.loadTestsFromNames(self.testNames,
--> 158                                                            self.module)
    159 
    160     def _do_discovery(self, argv, Loader=loader.TestLoader):

/usr/lib/python2.7/unittest/loader.pyc in loadTestsFromNames(self, names, module)
    126         of string specifiers. See 'loadTestsFromName()'.
    127         """
--> 128         suites = [self.loadTestsFromName(name, module) for name in names]
    129         return self.suiteClass(suites)
    130 

/usr/lib/python2.7/unittest/loader.pyc in loadTestsFromName(self, name, module)
     98         obj = module
     99         for part in parts:
--> 100             parent, obj = obj, getattr(obj, part)
    101 
    102         if isinstance(obj, types.ModuleType):

AttributeError: 'module' object has no attribute '/home/myuser/'

【问题讨论】:

您是否正在运行链接示例中的代码? 是的,完全相同的代码。在网站、notepad++(适用于 windows python)、putty(适用于 ubunty python)和 iPy notebook 浏览器窗口之间剪切和粘贴。 在下面查看我的答案。如果对您的问题有帮助,请点击绿色箭头接受。 【参考方案1】:

unittest.main() 主要用于命令行执行。

为了在 ipython 笔记本中运行单元测试,请删除代码的 if __name__ == '__main__' 部分,并在新单元格中创建一个测试套件,然后使用 TextTestRunner 运行它,

suite = unittest.TestLoader().loadTestsFromTestCase(TestSequenceFunctions)
unittest.TextTestRunner().run(suite)

【讨论】:

您不需要删除if __name__ == '__main__',只需更改unittest.main() 命令【参考方案2】:

由于 unittest.main 检查参数 (sys.argv) 而导致您收到该错误的原因。这就是启动 iPython 或 Jupyter 的原因。

将您的代码更改为:

if __name__ == '__main__':
    unittest.main(argv=['first-arg-is-ignored'], exit=False)

在 notebook 中,您还需要包含 exit=False 以防止 unittest.main 尝试关闭内核进程:

【讨论】:

首先感谢您的美丽博客。但我认为我仍然在错误.. /usr/lib64/python2.7/unittest/case.pyc in str__(self) 1102 def _str__(self): 1103 return "%s (% s)" % (strclass(self.__class), -> 1104 self._testFunc.__name_) 1105 1106 def repr__(self): AttributeError: 'str' object has no attribute ' __name'

以上是关于在 iPy Notebook 中运行 unittest 示例时出现 AttributeError的主要内容,如果未能解决你的问题,请参考以下文章

python SublimeREPL ipy_repl.py用于在Sublime Text中运行IPython 4 / Jupyter

[QNX Hypervisor 2.2用户手册]8.4 处理器间中断

pyspark 中的 K-means 在 jupyter notebook 中无限运行,在 zeppelin notebook 中运行良好

IPy模块--IP地址处理

unittes和developer

在Jupyter Notebook中运行FEniCS