lportii 14 #181894 Posted May 8, 2014 А чем это лучше отдельного модика? def auto_FlushPythonLog(): BigWorld.flushPythonLog() BigWorld.callback(1.0, auto_FlushPythonLog) Вот дела, я не знал. Можно в ваш загрузчик дописать простейший хук на stderror и на время работы хука перенаправить вывод ошибок куда угодно :) Ладно, сделаем. Я сам не так часто пишу моды, потому и в голову такое мне даже и не пришло, но я такие знал что у народ что-то уже придумал для взаимодействия с клиентом... :))) В принципе при таком подходе отпадает надобность в заглушках на встроенные модули. К тому же есть один полезный момент - при запущенном клиенте с realtime-загрузчиком я могу через него сделать обмен данными между средами Ориона и клиента :)))) А можно будет как нибудь, дополнить скрипт, чтобы он прекращал действие полностью, даже если не было ошибок. Или может внедрить критическую ошибку, чтобы модуль вырубался полностью (извращение немного..) ничего не придумалось лучше ) Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #181896 Posted May 8, 2014 А можно будет как нибудь, дополнить скрипт, чтобы он прекращал действие полностью, даже если не было ошибок. Или может внедрить критическую ошибку, чтобы модуль вырубался полностью (извращение немного..) ничего не придумалось лучше ) Поясни? Выгрузить модуль из памяти или что? Quote Share this post Link to post Short link Share on other sites
lportii 14 #181901 Posted May 8, 2014 (edited) Поясни? Выгрузить модуль из памяти или что? Например исполняется: from Avatar import PlayerAvatar _vehicle_onEnterWorld = PlayerAvatar.vehicle_onEnterWorld def __vehicle_onEnterWorld(self, vehicle): _vehicle_onEnterWorld(self, vehicle) print 'print' PlayerAvatar.vehicle_onEnterWorld = __vehicle_onEnterWorld Как остановить, без косяков, исполнение __vehicle_onEnterWorld, ведь он будет исполнятся пока игра запущена. Edited May 8, 2014 by lportii Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #181902 Posted May 8, 2014 Как остановить, без косяков, исполнение __vehicle_onEnterWorld, ведь он будет исполнятся пока игра запущена. PlayerAvatar.vehicle_onEnterWorld = _vehicle_onEnterWorld del __vehicle_onEnterWorld Не? Quote Share this post Link to post Short link Share on other sites
lportii 14 #181905 Posted May 8, 2014 (edited) PlayerAvatar.vehicle_onEnterWorld = _vehicle_onEnterWorld del __vehicle_onEnterWorld Не? Это понятно. А если не известно какие процедуры запускались, если их много. Хотелось бы одним махом остановить скрипт, и выгрузить его из памяти. п.с. а BigWorld.callback луп как остановить? Edited May 8, 2014 by lportii Quote Share this post Link to post Short link Share on other sites
MakcT40 331 #181907 Posted May 8, 2014 (edited) а BigWorld.callback луп как остановить?Речь об этом? some_function_cb = BigWorld.callback(some_function) ... BigWorld.cancelCallback(some_function_cb) ? Edited May 8, 2014 by MakcT40 Quote Share this post Link to post Short link Share on other sites
lportii 14 #181911 Posted May 8, 2014 (edited) Речь об этом: BigWorld.cancelCallback(some_function) ? Это сработает только внутри some_function. Из другого модуля это не сделать (могу ошибаться). Если (в примере выше) __vehicle_onEnterWorld можно увидеть в модуле, то скрытый внутри коллбак никак. Edited May 8, 2014 by lportii Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #181912 Posted May 8, 2014 (edited) Это понятно. А если не известно какие процедуры запускались, если их много. Хотелось бы одним махом остановить скрипт, и выгрузить его из памяти. А тогда надо делать так, вот у вас в загрузчике скрипт выполняется в модуле загрузчика: def __exec_file(file): temp_str = open(file, 'rb').read() if len(temp_str) > 0: exec temp_str Ну дык ведь "не правильно", надо чтоб он выполнялся в собственном модуле, для этого заменяем ваш скрипт на вот такой (Учтите писал на коленке! :)))): modules = [] def __exec_file(file): def importCode(code, name, config_name, add_to_sys_modules = 0): try: module = new_module(name) module.__file__ = config_name exec code in module.__dict__ except: modulesInfo[name] = None return None if add_to_sys_modules: sys.modules[name] = module return module from marshal import loads temp_str = open(file, 'rb').read()[8:] _, name = file.split('\\') name, _ = name.split('.') modules.append(importCode(loads(temp_str),name,file,0)) В результате все ваши файлы будут загружены как модули, и ссылки на них будут в modules. Когда потребуется убить модули, то делаем так: for value in modules: del value ЗЫ: И еще раз теперь схема "файл - модуль", то прежде чем грузить модуль по новой, надо будет его убивать или сделать алгоритм перезагрузки модуля Edited May 8, 2014 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
lportii 14 #181915 Posted May 8, 2014 for value in modules: del value Вроде пробовал ), сейчас еще раз затестим. Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #181916 Posted May 8, 2014 Вроде пробовал ), сейчас еще раз затестим. не забудьте обвязать try except: pass Quote Share this post Link to post Short link Share on other sites
MakcT40 331 #181921 Posted May 8, 2014 Это сработает только внутри some_function. Из другого модуля это не сделать (могу ошибаться).А вот такой пример: some_function_cb = 0 ... some_function_cb = BigWorld.callback(some_function) ... if some_function_cb != 0: BigWorld.cancelCallback(some_function_cb) some_function_cb = 0Не знаю, насколько этот способ "грамотный", но работает. Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #181924 Posted May 8, 2014 (edited) @MakcT40, мне кажется или можно проще: try: BigWorld.cancelCallback(some_function_cb) except: pass @RoxXx, добавил видео, потом еще сделаю. Edited May 8, 2014 by StranikS_Scan 1 Quote Share this post Link to post Short link Share on other sites
lportii 14 #181943 Posted May 8, 2014 Когда потребуется убить модули, то делаем так: for value in modules: del value Не работает. останавливается, без ошибок. Но можно просто переписать модуль с тем же именем, без удаления. Конечно внесенные изменения, типа прозрачные деревья это не восстановит. но старый модуль выполнятся не будет. Спасибо за помощь. Почему то, сам так не попробовал.) Quote Share this post Link to post Short link Share on other sites
fecell 125 #182007 Posted May 8, 2014 (edited) Не работает. останавливается, без ошибок. в код выше не вникал, но попробуй такие варианты: for value in enumerate(modules): del value или так: for value in modules: del modules[value] просто возможно что удаляется не модуль, а лишь индекс этого модуля присваиваемый в цикле переменной value Edited May 8, 2014 by fecell Quote Share this post Link to post Short link Share on other sites
lportii 14 #182012 Posted May 8, 2014 (edited) просто возможно что удаляется не модуль, а лишь индекс этого модуля присваиваемый в цикле переменной value Вот нашел, когда косяк вылез - Unloading a module from Python is not supported. Вообще много тем с подобными вопросами, но ничего толкового не нашел. Edited May 8, 2014 by lportii Quote Share this post Link to post Short link Share on other sites
fecell 125 #182025 Posted May 8, 2014 (edited) Вот нашел, когда косяк вылез - Unloading a module from Python is not supported. Вообще много тем с подобными вопросами, но ничего толкового не нашел. тогда так: names = ['httplib', 'dis'] modules = map(__import__, names) #....... import sys del modules for x in names: del sys.modules[x] print sys.modules # видно что 'httplib' и 'dis' - удалены print modules # ошибка - такого объекта уже нет Edited May 8, 2014 by fecell Quote Share this post Link to post Short link Share on other sites
lportii 14 #182035 Posted May 8, 2014 Не получается. Стабильно виснет на del. Quote Share this post Link to post Short link Share on other sites
fecell 125 #182190 Posted May 9, 2014 Не получается. Стабильно виснет на del. в орионе? Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #182196 Posted May 9, 2014 в орионе? Да нет, О тут не причем. Вообще код не рабочий: module = map(__import__,'dis') <<< Traceback (most recent call last): <<< File "<string>", line 1, in <module> <<< ImportError: No module named d Quote Share this post Link to post Short link Share on other sites
lportii 14 #182199 Posted May 9, 2014 в орионе? Нет, но надеюсь в орионе все скоро будет работать. Да нет, О тут не причем. Вообще код не рабочий: module = map(__import__,'dis') <<< Traceback (most recent call last): <<< File "<string>", line 1, in <module> <<< ImportError: No module named d 'dis' тут как набор букв получается. Quote Share this post Link to post Short link Share on other sites