Форум сайта python.su
Есть модуль.
import TableParser
class A: def proc(): TP = TableParser.TableParser2(self.DEBUG) # self.DEBUG берется из Conf.py TP.dictSetConf(self.login, self.password, self.taskName + '_TP', self.IP, self.dbName)
Отредактировано djvu (Дек. 6, 2018 15:28:52)
Офлайн
djvuнепонятно какой код вы изменяете в TableParser2. можете привести простенький пример?
как при изменении кода в TableParser2 переподключить модуль TableParser так что бы не перезапускать программу.
[code python][/code]
Офлайн
Была функция:
class TableParser2: def dictSetConf(login, password, taskName, IP, dbName) : a = login b = password c = taskName e = IP s = dbName print("OK")
class TableParser2: def dictSetConf(login, password, taskName, IP, dbName) : a = login b = password c = taskName e = IP s = dbName print("Fail")
class A: def proc(): import TableParser TP = TableParser.TableParser2(self.DEBUG) # self.DEBUG берется из Conf.py TP.dictSetConf(self.login, self.password, self.taskName + '_TP', self.IP, self.dbName) delete TableParser
Отредактировано djvu (Дек. 6, 2018 15:38:27)
Офлайн
а изменяете исходной код во время его выполнения?
Офлайн
djvuКаким образом вы изменяете “исходний код”? вы создаете класс наследник, или меняете метод класса непосредственно заменяя его другим? по типу :
Изменяем к примеру на :
import TableParser def dictSetConf(login, password, taskName, IP, dbName) : ...... print("Fail") if __name__ == '__main__': TableParser.TableParser2.dictSetConf = dictSetConf
[code python][/code]
Отредактировано PEHDOM (Дек. 6, 2018 21:24:42)
Офлайн
JOHN_16Да, во время выполнения.
а изменяете исходной код во время его выполнения?
Офлайн
PEHDOM
Каким образом вы изменяете “исходний код”? вы создаете класс наследник, или меняете метод класса непосредственно заменяя его другим? по типу :
Офлайн
Приведу пример как я сделал в своем старом движке на C++ + python.
С++ вызывает интерпритатор python. Здесь исходники python можно править во время выполнения программы. Каждые новые полученные данные будут обрабатываться с внесенными правками в исходный код python без перезапуска.
Мало ли кому пригодится.
Функция вызывается каждый раз как приходят данные. Она упрощена до мест использования python.
int TrPluginImpl::trprocessing(ODS::IObject& from, ODS::IObject & to) { tparser = new TableParser(); tparser->init(); do { if (tparser->dict_set_conf((char *) conn_conf->get_login(), (char *) conn_conf->get_password(), (char *) "input_python_psfoi", (char *) conn_conf->get_ip(), (char *) conn_conf->get_name()) == false) { ret = -1; break; } QString xml_tmb = (tparser->parse((char *) table.toStdString().c_str(), (char *) table_name.toStdString().c_str(), (char *) from.getStringAttr("uno").toStdString().c_str()).c_str()); ret = -1; break; } } while (0); tparser->clear(); delete tparser; return ret; }
PyObject *TableParser::init() { do { // Инициализировать интерпретатор Python Py_Initialize(); this->sys = PyImport_ImportModule("sys"); this->sys_path = PyObject_GetAttrString(sys, "path"); this->folder_path = PyUnicode_FromString((const char*) TABLEPARSER_PATH); PyList_Append(this->sys_path, this->folder_path); //PySys_SetPath((const wchar_t*) VPEPARSER_PATH); // Построить объект имени this->pName = PyUnicode_FromString("TableParser"); if (!this->pName) { PyErr_Print(); break; } // Загрузить объект модуля this->pModule = PyImport_Import(this->pName); if (!pModule) { PyErr_Print(); break; } // pDict – заимствованная ссылка this->pDict = PyModule_GetDict(this->pModule); // построить имя вызываемого класса this->pClass = PyDict_GetItemString(this->pDict, (const char *) "TableParser"); // создать экземпляр класса if (PyCallable_Check(this->pClass)) { this->pInstance = PyObject_CallObject(this->pClass, NULL); } else { break; } return this->pInstance; } while (0); return NULL; } void TableParser::clear() { // Вернуть ресурсы системе Py_XDECREF(this->pInstance); Py_XDECREF(this->pClass); Py_XDECREF(this->pDict); Py_XDECREF(this->pModule); Py_XDECREF(this->pName); Py_XDECREF(this->folder_path); Py_XDECREF(this->sys_path); Py_XDECREF(this->sys); // Завершить интерпретатор Python Py_Finalize(); } std::string TableParser::parse(char *table, char *table_type, char *uno, char *uid, int id) { /* PyObject *pValue = PyObject_CallMethod(this->pInstance, (char *) "parse", (char *) "(ss)", table, table_type); if (pValue != NULL) { Py_XDECREF(pValue); } else { PyErr_Print(); } return; */ std::string str; PyObject *pStr = PyObject_CallMethod(this->pInstance, (char *) "parse", (char *) "(ssssi)", table, table_type, uno, uid, id); if (pStr != NULL) { //int count = (int) PyByteArray_Size(pStr); PyObject* pResultRepr = PyObject_Repr(pStr); str = (char *) PyBytes_AS_STRING(PyUnicode_AsEncodedString(pResultRepr, (char *) "utf-8", (char *) "ERROR")); Py_XDECREF(pResultRepr); Py_XDECREF(pStr); } else { PyErr_Print(); return std::string("[error]: python call method parse"); //PyErr_Print(); } //Py_XDECREF(pStr); find_and_replace(str, "\\n", "\n"); find_and_replace(str, "\\t", "\t"); str.erase(str.begin()); str.erase(str.end() - 1); return str; } bool TableParser::dict_set_conf(char *_login, char *_password, char *_id, char *_ip, char *_name) { bool ret = false; PyObject *pVal = PyObject_CallMethod(this->pInstance, (char *) "dict_set_conf", (char *) "(sssss)", _login, _password, _id, _ip, _name); if (pVal != NULL) { ret = (bool) PyBool_Check(pVal); Py_XDECREF(pVal); } else { PyErr_Print(); return ret; } return ret; }
Отредактировано djvu (Дек. 7, 2018 10:55:29)
Офлайн
> Есть сервис в него приходят данные, эти данные мне надо расспарсить…Я хочу на лету править исходный код, что бы новые данные обрабатывались без перезапуска сервиса.
exec может выполнить любой текст как код. Его используй, хотя я не вижу никакой проблемы в разных форматах даты.
Онлайн
есть такой модуль importlib - его можно использовать для загрузки питон модуля, после изменения исходного кода того самого модуля.
Офлайн