Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Proper way to reload a python module from the console

Tags:

python

I'm debugging from the python console and would like to reload a module every time I make a change so I don't have to exit the console and re-enter it. I'm doing:

>>> from project.model.user import * >>> reload(user) 

but I receive:

>>>NameError: name 'user' is not defined 

What is the proper way to reload the entire user class? Is there a better way to do this, perhaps auto-updating while debugging?

Thanks.

like image 861
ensnare Avatar asked Mar 28 '10 20:03

ensnare


People also ask

How do you reload a Python module?

The reload() - reloads a previously imported module or loaded module. This comes handy in a situation where you repeatedly run a test script during an interactive session, it always uses the first version of the modules we are developing, even we have mades changes to the code.

Which of the following is the correct way to load module in Python?

Import in python is similar to #include header_file in C/C++. Python modules can get access to code from another module by importing the file/function using import. The import statement is the most common way of invoking the import machinery, but it is not the only way.

How do I reload Python 3?

In Python 3, reload was moved from builtins to imp. So to use reload in Python 3, you'd have to write imp. reload(moduleName) and not just reload(moduleName).


1 Answers

As asked, the best you can do is

>>> from project.models.user import * >>> import project # get module reference for reload >>> reload(project.models.user) # reload step 1 >>> from project.models.user import * # reload step 2 

it would be better and cleaner if you used the user module directly, rather than doing import * (which is almost never the right way to do it). Then it would just be

>>> from project.models import user >>> reload(user) 

This would do what you want. But, it's not very nice. If you really need to reload modules so often, I've got to ask: why?

My suspicion (backed up by previous experience with people asking similar questions) is that you're testing your module. There are lots of ways to test a module out, and doing it by hand in the interactive interpreter is among the worst ways. Save one of your sessions to a file and use doctest, for a quick fix. Alternatively, write it out as a program and use python -i. The only really great solution, though, is using the unittest module.

If that's not it, hopefully it's something better, not worse. There's really no good use of reload (in fact, it's removed in 3.x). It doesn't work effectively-- you might reload a module but leave leftovers from previous versions. It doesn't even work on all kinds of modules-- extension modules will not reload properly, or sometimes even break horribly, when reloaded.

The context of using it in the interactive interpreter doesn't leave a lot of choices as to what you are doing, and what the real best solution would be. Outside it, sometimes people used reload() to implement plugins etc. This is dangerous at best, and can frequently be done differently using either exec (ah the evil territory we find ourselves in), or a segregated process.

like image 175
Devin Jeanpierre Avatar answered Sep 25 '22 14:09

Devin Jeanpierre