Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

“I/O operation on closed file” when try with "Debugging from a separate terminal" #598

Closed
guoyejun opened this issue Apr 10, 2023 · 12 comments
Labels

Comments

@guoyejun
Copy link

Hi, I met “I/O operation on closed file” when try with "Debugging from a separate terminal" at https://documen.tician.de/pudb/starting.html#debugging-from-a-separate-terminal.

I'm using conda with below versions:

$ python --version
Python 3.9.7
$ pudb --version    
pudb v2022.1.3
$ which pudb
/home/testit/miniconda3/envs/trypudb/bin/pudb

my python code:

$ cat try.py
from datetime import datetime
import os
import sys

from pudb.remote import set_trace
set_trace()

if __name__ == "__main__":
    print(' '.join(sys.argv))
    begin = datetime.now()
    print("begin process", os.getpid(), "at", begin.strftime('%Y-%m-%d %H:%M:%S'))

On the first terminal, I tried with:

$ tty
/dev/pts/3
$ perl -MPOSIX -e pause

On the second terminal, I met the below issue. Should I run with 'root'? thanks.

$ PUDB_TTY=/dev/pts/3 pudb try.py
Traceback (most recent call last):
  File "/home/testit/miniconda3/envs/trypudb/lib/python3.9/site-packages/pudb/debugger.py", line 2434, in call_with_ui
    return f(*args, **kwargs)
  File "/home/testit/miniconda3/envs/trypudb/lib/python3.9/site-packages/pudb/debugger.py", line 2740, in interaction
    self.event_loop()
  File "/home/testit/miniconda3/envs/trypudb/lib/python3.9/site-packages/pudb/debugger.py", line 2696, in event_loop
    self.screen.draw_screen(self.size, canvas)
  File "/home/testit/miniconda3/envs/trypudb/lib/python3.9/site-packages/urwid/raw_display.py", line 708, in draw_screen
    self._setup_G1()
  File "/home/testit/miniconda3/envs/trypudb/lib/python3.9/site-packages/urwid/raw_display.py", line 687, in _setup_G1
    self.write(escape.DESIGNATE_G1_SPECIAL)
  File "/home/testit/miniconda3/envs/trypudb/lib/python3.9/site-packages/urwid/raw_display.py", line 286, in write
    self._term_output_file.write(data)
ValueError: I/O operation on closed file.

@guoyejun guoyejun added the Bug label Apr 10, 2023
@axman6
Copy link

axman6 commented Jun 1, 2023

I’m also having this issue, which is problematic because when the app I’m debugging prints anything, the pudb UI disappears until I terminate the app.

@axman6
Copy link

axman6 commented Jun 1, 2023

I believe I’ve found an alternative way to achieve the PUDB_TTY trick, instead of setting the end var, if you redirect stein to be the tty, it seems to work:

$ tty
/dev/pts/17
$ perl -MPOSIX -e pause
$ pudb something.py args < /dev/pts/17
# TUI appears

if you also pipe the output into that tty, you end up with the UI being drawn in the first terminal, and being able to interact with it there.

Sadly this doesn’t solve the issue I have that when the app prints anything, the tui disappears completely in the second shell, and doesn’t reappear until the app exits. sending Ctrl-l via the first terminal doesn’t seem to redraw. Surely I’m not the first person to ever debug an app that logs to stdout?

Looks like the issue above isn’t related to to printing to stdout (they were just correlated in time), something strange seems to be happening with tkinter which causes the tui to disappear completely sometime before the main window appears.

@stdedos
Copy link
Contributor

stdedos commented Oct 9, 2023

The latest version

Installing collected packages: pudb
  Attempting uninstall: pudb
    Found existing installation: pudb 2022.1.3
    Uninstalling pudb-2022.1.3:
      Successfully uninstalled pudb-2022.1.3
Successfully installed pudb-2023.1

also gives me

Traceback (most recent call last):
  File ".venv/lib/python3.11/site-packages/pudb/debugger.py", line 466, in user_line
    self.interaction(frame)
  File ".venv/lib/python3.11/site-packages/pudb/debugger.py", line 436, in interaction
    self.ui.call_with_ui(self.ui.interaction, exc_tuple,
  File ".venv/lib/python3.11/site-packages/pudb/debugger.py", line 2540, in call_with_ui
    self.show()
  File ".venv/lib/python3.11/site-packages/pudb/debugger.py", line 2531, in show
    self.screen.start()
  File ".venv/lib/python3.11/site-packages/urwid/display_common.py", line 813, in start
    self._start(*args, **kwargs)
  File ".venv/lib/python3.11/site-packages/urwid/raw_display.py", line 222, in _start
    self.write(escape.SWITCH_TO_ALTERNATE_BUFFER)
  File ".venv/lib/python3.11/site-packages/urwid/raw_display.py", line 286, in write
    self._term_output_file.write(data)
ValueError: I/O operation on closed file.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File ".venv/lib/python3.11/site-packages/pudb/debugger.py", line 2456, in show_internal_exc_dlg
    self._show_internal_exc_dlg(exc_tuple)
  File ".venv/lib/python3.11/site-packages/pudb/debugger.py", line 2479, in _show_internal_exc_dlg
    urwid=".".join(map(str, urwid.version.version)),
                            ^^^^^^^^^^^^^^^^^^^^^
AttributeError: module 'urwid.version' has no attribute 'version'

😕

@stdedos
Copy link
Contributor

stdedos commented Oct 9, 2023

Also seems to be related to #317 (comment)?

@marc-h38
Copy link

marc-h38 commented Dec 4, 2023

ValueError: I/O operation on closed file.

I successfully git bisected this. Reverting one-line commit 277980e (July 2022) avoids this issue. That tty.close() really does look like a smoking gun!

Revert successfully tested on top of current version 8c8f9d4.

I don't know yet if this revert has any undesired side-effect; I only found this right now and wanted to share this "breakthrough" ASAP. That commit message and the corresponding PR #534 were both empty. I will for sure use that one-line revert "in anger" and report back if I find any problem.

--- a/pudb/__init__.py
+++ b/pudb/__init__.py
@@ -80,6 +80,7 @@ def _get_debugger(**kwargs):
             kwargs.setdefault("stdin", tty_file)
             kwargs.setdefault("stdout", tty_file)
             kwargs.setdefault("term_size", term_size)
+            tty_file.close()
 
         from pudb.debugger import Debugger
         dbg = Debugger(**kwargs)

@stdedos
Copy link
Contributor

stdedos commented Dec 4, 2023

That's awesome work!

Can you contribute your testing methodology? 🙏

@marc-h38
Copy link

marc-h38 commented Dec 4, 2023

That's awesome work!

Can you confirm it works for you too?

Can you contribute your testing methodology?

export PUDB_TTY=/dev/pts/X
./try-the-debugger.sh 

@marc-h38
Copy link

marc-h38 commented Dec 4, 2023

I will for sure use that one-line revert "in anger" and report back if I find any problem.

This revert did not last long. It makes PUDB_TTY go further but things are still not OK: many keys don't work and the terminal acts strangely. Even without a commit message I guess this line was there for a reason.

Instead I installed the last official release before this commit and so far things seem to work: pip install pudb==2022.1.2
https://pypi.org/project/pudb/#history

@ejeffrey
Copy link

I'm having this issue too, and for me removing tty_file.close() call fixed the problem entirely.

@msbrogli
Copy link

I also had the same issues and removing the tty_file.close() fixed the issue entirely.

@MatrixManAtYrService
Copy link
Contributor

Same here, so I made a PR.

@inducer
Copy link
Owner

inducer commented Jul 23, 2024

Fixed by #656.

@inducer inducer closed this as completed Jul 23, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

8 participants