Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to reload a Class in python shell?

Tags:

python

ipython

If I import a module defining a class of the same name belonging to a package, it is imported as a Class, not a Module because of the __init__.py of the parent package. See different import results at different directories for details. In Python shell or ipython shell, if I do

from MyPak import MyMod

MyModule is always imported as Class thus I can not reload it (reload() works only for modules). Run

from MyPak import MyMod

again does not seem to update the Class definition. Could anyone suggest a way to update the class in python shell?

ps. without restarting the python interpreter.

pps. Just in case you have the code in hand and want to test it: I am actually talking about BioPython, and I am working on Bio.PDB.PDBParser. I have an ipython shell (v0.10) and edit PDBParser.py. Just got no way to reload it in ipython.

so here is what I did:

# start ipython v0.10 import Bio from Bio.PDB import PDBParser p = PDBParser() s = p.get_structure() # then I make changes,e.g. simply print some text, in PDBParser.py del Bio del PDBParser del s import Bio  # or reload(Bio) without deleting all the objects from Bio.PDB import PDBParser p = PDBParser() s = p.get_structure() # expected output after change not seen :( 

I could not see the printed text. The changes were not applied somehow.

like image 530
HongboZhu Avatar asked Aug 04 '11 18:08

HongboZhu


People also ask

How do you reload in 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).

How do I import a .PY class?

Importing a specific class by using the import commandpy file just like MyFile.py and make the class your desired name. Then in the main file just import the class using the command line from MyFile import Square.

Can you import a class from a module in Python?

Python modules can get access to code from another module by importing the file/function using import. The import statement is that the commonest way of invoking the import machinery, but it's not the sole way. The import statement consists of the import keyword alongside the name of the module.


2 Answers

On Python 3 only, import the reload function:

>>> from importlib import reload 

On both Python 2.x, and 3.x, you can then simply call reload on the module:

>>> import MyPak >>> reload(MyPak) >>> from MyPak import MyMod 

However, instances of the old class will not be updated (there's simply no code that describes the update mechanism).

like image 84
phihag Avatar answered Sep 22 '22 12:09

phihag


I finally found the answer:

import MyPak from MyPak import MyMod 

after editing MyPak/MyMod.py file, to reload the class MyMod in the file MyMod.py, one needs to

import sys del sys.modules['MyPak.MyMod']  reload(MyPak) from MyPak import MyMod 

Caveats:

  1. Executing del MyPak or del MyMod or del MyPak.MyMod does not solve the problem since it simply removes the name binding. Python only searches sys.modules to see whether the modules had already been imported. Check out the discussion in the post module name in sys.modules and globals().

  2. When reloading MyPak, python tries to execute the line from MyMod import MyMod in MyPak/__init__.py. However, it finds MyPak.MyMod in sys.modules, thus it will NOT reload MyMod although MyPak/MyMod.py has been updated. And you will find that no new MyPak/MyMod.pyc is generated.

like image 20
HongboZhu Avatar answered Sep 23 '22 12:09

HongboZhu