Форум сайта python.su
djvuв importlib есть функция reload, она позволяет заново подгрузить уже импортированый модуль
Во время выполнения хочу править исходник с классом TableParser.
..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…
[code python][/code]
Офлайн
JOHN_16
importlib
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)
Отредактировано djvu (Дек. 7, 2018 12:14:02)
Офлайн
djvuтогда imp
Использую python3.2
class TableParser2: def dictSetConf(self) : # тут какойто код print("OK")
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 >>>
[code python][/code]
Отредактировано PEHDOM (Дек. 7, 2018 12:28:07)
Офлайн
Парни, правка кода в TableParser отработала.
import TableParser imp.reload(TableParser)
Офлайн
djvuтак нужно в самом TableParser добавить перезагрузку модулей которые он подгружает
Сейчас додумаю как сделать, так что бы правки кода и из других файлов которые использует TableParser заработали.
[code python][/code]
Офлайн
PEHDOMДа. Я думал, что хватит перезагрузить TableParser и когда он перезагрузится все moduls которые в нем подключаются то же перезагрузятся. Но оказалось, что не так.
Офлайн
Почему недостаточно перегрузить только TableParser? Может кто объяснит?
Офлайн
djvuну такая логика функции. На самом деле чтобы скзать чтото определенное нужно лезть в исходники, но в документации сказано буквально следующее
Почему недостаточно перегрузить только TableParser? Может кто объяснит?
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.
[code python][/code]
Отредактировано PEHDOM (Дек. 7, 2018 15:54:42)
Офлайн
PEHDOMВ принципе логично, спасибо.
Офлайн