Найти - Пользователи
Полная версия: Динамическая подгрузка и выгрузка модулей.
Начало » Python для экспертов » Динамическая подгрузка и выгрузка модулей.
1 2
PEHDOM
djvu
Во время выполнения хочу править исходник с классом TableParser.
в importlib есть функция reload, она позволяет заново подгрузить уже импортированый модуль
https://docs.python.org/3/library/importlib.html#importlib.reload
..This is useful if you have edited the module source file using an external editor and want to try out the new version without leaving the Python interpreter…
djvu
JOHN_16
importlib

Использую python3.2

importlib & imp смотрел в эту сторону, вчера и сегодня. Не работает у меня.

         imp.reload(sys)
        sys.path.append('/usr/local/foi2/bin/src')
        sys.path.append('/usr/local/foi2/conf')
        sys.path.append('/usr/local/foi2/ods')
        
        import TableParser
        imp.reload(TableParser)
        
        
        TP = TableParser.TableParser(self.DEBUG) # self.DEBUG берется из Conf.py
        TP.dictSetConf(self.login, self.password, self.taskName + '_TP', self.IP, self.dbName)

и sys перегружал.

Правда, у меня одна особенность есть. Методы TableParser создают классы из других файлов и используют их. Может тоже как то влияет? Потому что я как раз правлю не TableParser, а другие файлы которые использует TableParser.
PEHDOM
djvu
Использую python3.2
тогда imp
TableParser.py
 class TableParser2:
   def dictSetConf(self) :
      # тут какойто код
      print("OK")
main.py
 from imp import reload
import TableParser
tb = TableParser.TableParser2()
tb.dictSetConf()
print('='*20)
input('press any key to continue') # пока программа ждет меняем исходник TableParser заменяя ОК на FAIL
reload(TableParser)
tb = TableParser.TableParser2()
tb.dictSetConf()
>>> 
OK
====================
FAIL
>>> 
djvu
Парни, правка кода в TableParser отработала.

 import TableParser
imp.reload(TableParser)

Сейчас додумаю как сделать, так что бы правки кода и из других файлов которые использует TableParser заработали.
PEHDOM
djvu
Сейчас додумаю как сделать, так что бы правки кода и из других файлов которые использует TableParser заработали.
так нужно в самом TableParser добавить перезагрузку модулей которые он подгружает
djvu
PEHDOM
Да. Я думал, что хватит перезагрузить TableParser и когда он перезагрузится все moduls которые в нем подключаются то же перезагрузятся. Но оказалось, что не так.

Все заработало!
djvu
Почему недостаточно перегрузить только TableParser? Может кто объяснит?
PEHDOM
djvu
Почему недостаточно перегрузить только TableParser? Может кто объяснит?
ну такая логика функции. На самом деле чтобы скзать чтото определенное нужно лезть в исходники, но в документации сказано буквально следующее
https://docs.python.org/3/library/importlib.html#importlib.reload
When reload() is executed:

Python module’s code is recompiled and the module-level code re-executed, defining a new set of objects which are bound to names in the module’s dictionary by reusing the loader which originally loaded the module. The init function of extension modules is not called a second time.
……..
Other references to the old objects (such as names external to the module) are not rebound to refer to the new objects and must be updated in each namespace where they occur if that is desired.
Тоесть оно перегружает только тот модуль котороый указано, а не рекурсивно лезет пергружать весь зоопарк котороый может тянуть за собой модуль. Это в общемто нормально, так как пайтон пропускает повторный импорт в целях оптимизации скорости.
djvu
PEHDOM
В принципе логично, спасибо.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB