py.test 来自 Visual Studio - “_DebuggerOutput”对象没有属性 'closed'

py.test from Visual Studio - '_DebuggerOutput' object has no attribute 'closed'

我正在为 Visual Studio 和 py.test 使用 Python 工具。如果我 运行 没有调试的脚本,我可以很好地使用 pytest,但是当我 运行 进行调试时,脚本崩溃了。下面是我的代码和我在控制台中获得的输出 window。我已经在 Google 中搜索了答案,但没有找到解决这个问题的方法;似乎以前没有人遇到过这个确切的问题。我 运行宁 Visual Studio 2013 年,使用 PTVS 2.1 VS 2013。

#Code
import pytest
if __name__ == "__main__":
    pytest.main("--resultlog=resultlog.txt")

#Output
! C:\Python34\lib\site-packages\colorama\ansitowin32.py
 Traceback (most recent call last):
   File "C:\Python34\lib\site-packages\_pytest\main.py", line 80, in wrap_session
     config.do_configure()
   File "C:\Python34\lib\site-packages\_pytest\config.py", line 618, in do_configure
     self.hook.pytest_configure(config=self)
   File "C:\Python34\lib\site-packages\_pytest\core.py", line 521, in __call__
     return self._docall(self.methods, kwargs)
   File "C:\Python34\lib\site-packages\_pytest\core.py", line 528, in _docall
     firstresult=self.firstresult).execute()
   File "C:\Python34\lib\site-packages\_pytest\core.py", line 394, in execute
     res = method(*args)
   File "C:\Python34\lib\site-packages\_pytest\terminal.py", line 41, in pytest_configure
     reporter = TerminalReporter(config, sys.stdout)
   File "C:\Python34\lib\site-packages\_pytest\terminal.py", line 101, in __init__
     self._tw = self.writer = py.io.TerminalWriter(file)
   File "C:\Python34\lib\site-packages\py\_io\terminalwriter.py", line 130, in __init__
     file = colorama.AnsiToWin32(file).stream
   File "C:\Python34\lib\site-packages\colorama\ansitowin32.py", line 68, in __init__
     convert = on_windows and not wrapped.closed and not on_emulated_windows and is_a_tty(wrapped)
 AttributeError: '_DebuggerOutput' object has no attribute 'closed'

问:如何解决这个错误,以便我可以从内部调试 Visual Studio?


这是 PTVS 中的一个 bug,已为即将发布的 2.2 版本修复。

目前还没有包含修复的构建,但您可以自己应用它,因为它在 .py 文件中,不需要重新编译。您需要的文件是:

C:\Users\...\AppData\Local\Microsoft\VisualStudio.0Exp\Extensions\Microsoft\Python Tools for Visual Studio.1\visualstudio_py_debugger.py

在里面找到class_DebuggerOutput,在最后添加:

def __getattr__(self, name):
    return getattr(self.old_out, name)