Step by step debugging


#1

Hello,
Does anyone have a workflow or a workaround in order to use a debugger while running plugins ?
It would be really great to be able to jump in the process() code with pdb or pudb…
cheers,


#2

What happens when you try?


#3

Here is the log of pdb when setting a trace in a collector plugin:

Processing CollectSingleFilesInCwd
> <string>(26)process()
(Pdb) l
[EOF]
(Pdb) 

I have a similar issue with pudb where it suggests to use inline_cache module…


#4

Ah, I can’t tell for sure, but my guess is it’s having trouble following a command that doesn’t have a file associated to it. You see when plug-ins are discovered on disk, they are loaded as a block of text, rather than imported directly. This is how they are able to reload themselves interactively. It’s possible this throws off any debugger.

Try running it with a simpler program, like this one.

from pyblish import api, util

class MyPlugin(api.ContextPlugin):
  order = api.CollectorOrder
  def process(self, context):
    context.create_instance("MyInstance")
    self.log.info("Hello world")

util.publish(plugins=[MyPlugin])

This won’t do any of the discovery magic, but rather just run the class as declared.


#5

Hi,
For the moment as I need more the debugging than the autoreload, I’ve switched to using imp module to load the plugins from source. Here is a snippet of my updated code (imp is imported first):

try:
    module = imp.load_source(mod_name, abspath)
except Exception as err:
    log.debug("Skipped: \"%s\" (%s)", mod_name, err)
    continue

Is the autoreload a functionality used within the UI only ?
Would it be interesting to have the ability to switch between the two loading modes ? Using an env var or an argument to api.discover()
cheers,


#6

Yes, that could be interesting. If you’re up for it, I’d be happy to consider PYBLISH_AUTORELOAD as a good canditate for an environment variable.

Did the debugger work with that?


#7

Yep it works like a charm… (python-2.7.5)

I don’t know if imp the correct goto as it might be replaced with importlib with >2.7. We just need to be careful not to have different behaviours with different pythons…

Also there might be some optimisation in loading precompiled python if found in the folder.