Уведомления

Группа в Telegram: присоединиться

#1 Дек. 7, 2018 12:08:23

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 1027
Репутация: +  167  -
Профиль   Отправить e-mail  

Динамическая подгрузка и выгрузка модулей.

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…

Офлайн

#2 Дек. 7, 2018 12:09:07

djvu
Зарегистрирован: 2018-12-06
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамическая подгрузка и выгрузка модулей.

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.

Отредактировано djvu (Дек. 7, 2018 12:14:02)

Офлайн

#3 Дек. 7, 2018 12:15:02

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 1027
Репутация: +  167  -
Профиль   Отправить e-mail  

Динамическая подгрузка и выгрузка модулей.

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
>>> 

Отредактировано PEHDOM (Дек. 7, 2018 12:28:07)

Офлайн

#4 Дек. 7, 2018 12:17:06

djvu
Зарегистрирован: 2018-12-06
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамическая подгрузка и выгрузка модулей.

Парни, правка кода в TableParser отработала.

 import TableParser
imp.reload(TableParser)

Сейчас додумаю как сделать, так что бы правки кода и из других файлов которые использует TableParser заработали.

Офлайн

#5 Дек. 7, 2018 12:23:50

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 1027
Репутация: +  167  -
Профиль   Отправить e-mail  

Динамическая подгрузка и выгрузка модулей.

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

Офлайн

#6 Дек. 7, 2018 12:51:23

djvu
Зарегистрирован: 2018-12-06
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамическая подгрузка и выгрузка модулей.

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

Все заработало!

Офлайн

#7 Дек. 7, 2018 13:14:12

djvu
Зарегистрирован: 2018-12-06
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамическая подгрузка и выгрузка модулей.

Почему недостаточно перегрузить только TableParser? Может кто объяснит?

Офлайн

#8 Дек. 7, 2018 15:50:08

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 1027
Репутация: +  167  -
Профиль   Отправить e-mail  

Динамическая подгрузка и выгрузка модулей.

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.
Тоесть оно перегружает только тот модуль котороый указано, а не рекурсивно лезет пергружать весь зоопарк котороый может тянуть за собой модуль. Это в общемто нормально, так как пайтон пропускает повторный импорт в целях оптимизации скорости.

Отредактировано PEHDOM (Дек. 7, 2018 15:54:42)

Офлайн

#9 Дек. 7, 2018 19:22:37

djvu
Зарегистрирован: 2018-12-06
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамическая подгрузка и выгрузка модулей.

PEHDOM
В принципе логично, спасибо.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version