AdamC
AdamC

Reputation: 426

Why does this test crash when pdb.set_trace() is called?

Simple unittest below.

If I run it (e.g., python -m unittest module_name) without 'test' as an argument, it passes. If I run it with 'test' as an argument, I get "TypeError: bad argument type for built-in operation". Why?

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

contextlib.redirect_stdout version:

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')

Thanks in advance.

Edit: The original program was tested in Python 3.4 in both Debian and Windows 7.

Something similar (using environment flags instead of a command line argument) appears to hang in Python 2, but pressing c allows it to finish, so I'm guessing it might just be that pdb's UI has been redirected.But the Python 3 version has the behavior initial described (crashes), although a colleague tested on 3.4 on Mac OS and saw the "hang" behavior.

Upvotes: 2

Views: 782

Answers (1)

tzaman
tzaman

Reputation: 47780

You need to give pdb the original stdout:

pdb.Pdb(stdout=sys.__stdout__).set_trace()

Upvotes: 5

Related Questions