为什么在调用pdb.set_trace()时此测试崩溃?

Ada*_*amC 2 python python-3.x pdb

下面是简单的单元测试。

如果我在不使用“ test”作为参数的情况下运行它(例如python -m unittest module_name),它将通过。如果以“ test”作为参数运行它,则会收到“ TypeError:内置操作的错误参数类型”。为什么?

from io import StringIO
import sys
from unittest import TestCase

class TestSimple(TestCase):
    def test_simple(self):
        old_stdout = sys.stdout
        buf = StringIO()
        try:
            sys.stdout = buf
            print('hi')
        finally:
            import pdb
            if 'test' in sys.argv:
                pdb.set_trace()
            sys.stdout = old_stdout
Run Code Online (Sandbox Code Playgroud)

contextlib.redirect_stdout版本:

from contextlib import redirect_stdout
from io import StringIO
import pdb
import sys
from unittest import TestCase

class TestSimple(TestCase):
    def test_simple(self):
        buf = StringIO()
        with redirect_stdout(buf):
            print('hi')
            pdb.set_trace()
        print('finis')
Run Code Online (Sandbox Code Playgroud)

提前致谢。

编辑: 原始程序已在Debian和Windows 7中的Python 3.4中进行了测试。

类似的东西(使用环境标志而不是命令行参数)似乎在Python 2中挂起,但是按c可以完成它,所以我猜测可能是pdb的UI已被重定向。但是Python 3版本具有最初描述的行为(崩溃),尽管一位同事在Mac OS上在3.4上进行了测试并看到了“挂起”行为。

tza*_*man 5

您需要提供pdb原始文件stdout

pdb.Pdb(stdout=sys.__stdout__).set_trace()
Run Code Online (Sandbox Code Playgroud)