I want to debug my plugin with pdb but it doesn't work. I get these errors
Traceback (most recent call last):
File "./sublime_plugin.py", line 362, in run_
File "./useIt.py", line 14, in run
for region in self.view.sel():
File "./useIt.py", line 14, in run
for region in self.view.sel():
File ".\bdb.py", line 46, in trace_dispatch
File ".\bdb.py", line 65, in dispatch_line
bdb.BdbQuit
Has anyone an idea? Or some other way to debug a sublime plugin?
The problem is that sys.stdin
is not attached to anything normally. But, sys.stdin
does work if you start SublimeText2 from a console:
On Mac, start the application by locating the executable in the resource bundle by entering the full path in the Terminal:
/Applications/Sublime\ Text\ 2.app/Contents/MacOS/Sublime\ Text\ 2
On Windows, start the application from the Windows Console:
"C:\Program Files\Sublime Text 2\sublime_text.exe"
provisional, I have no Windows Sublime Text 2 install so this command line is based on a quick Google
Now the application has a console; but sys.stdout
is still redirected to the built-in SublimeText 2 console. You want to start your debugger with the correct stdout
, the one still connected to your console. Instead of import pdb; pdb.set_trace()
, use:
import pdb, sys; pdb.Pdb(stdout=sys.__stdout__).set_trace()
The original console stdout
is saved in sys.__stdout__
and by passing that to pdb.Pdb()
you get a fully functional pdb
session.
The easiest way I found was to use Visual Studio.
You should have the Python development tools for Visual Studio (you can download them by opening the Visual Studio Installer, clicking on more, modify and selecting Python development).
To debug you need to open visual studio, select from the toolbar: Debug - Attach to process (Ctrl+Alt+P) and then find 'plugin_host.exe' and attach. Then open your file 'plugin.py' and put a breakpoint somewhere and you're good to go.
Working on my plugin, I didn't have much luck with pdb, and "print" is not an efficient debugging experience (for example, if you aren't sure where the defect is, you might add a lot of "print" - and then have to remove them after).
There is a much better alternative if you run Windows. The latest version 2.2 of the Python tools for Visual Studio works great for debugging Sublime plugins. You get all the regular debugging features of Visual Studio and it's a polished experience. Just choose "pluginhost.exe" and the Python debugging engine in the attach dialog. Previous to 2.2, the Python tools did not work properly against Sublime, for example stepping was broken.
Disclosure: I work in Visual Studio but do not work on these tools. I recently worked with the Python tools developer to fix the bugs I encountered using these tools to write my plugin.
The Community Edition of Visual Studio 2015 is free to individual developers and small organizations. Just make sure you check Python tools in the setup dialog. And, of course, you must be running Windows.
Your problem is that sys.stdin
and sys.stdout
(Edit: stdout goes to the console) are connected into the internals of sublime text - where do you expect to be able to control the debugger?
What you want is a remote debugging interface that interacts through something other than stdio, such as rpdb
.