Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
 Аватар для GulgDev
132 / 118 / 29
Регистрация: 09.07.2019
Сообщений: 1,071

Хук Python

14.01.2020, 15:01. Показов 3523. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Надо написать хук, срабатывающий при создании либо изменении переменной.
Например:
Python
1
2
3
4
5
def hook(frame,name,value):
    print(frame,name,value)
setvarhook(hook)
x = 5 # <frame at 0x00465C28, file 'main.py', line 4, code <module>> x 5
y = 3 # <frame at 0x00655C28, file 'main.py', line 5, code <module>> y 3
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.01.2020, 15:01
Ответы с готовыми решениями:

Ускорить хук
Как ускорить мой хук? from sys import _current_frames; from inspect import currentframe as _current_frame; from threading...

Python cv2 сконвертировать Python многомерный массив в картинку
Python cv2, необходимо сконвертировать многомерный массив в картинку, например: Дано: , , ] Где каждые 3 значения - цвета пикселя...

Python - момент истины. Python - как оружие возмездие против системы
Какие модули в python мне нужны для взлома баз данных? Перехвата информации? Внедрения в систему? Добавлено через 10 минут Хочу...

21
 Аватар для Wolflind
127 / 107 / 31
Регистрация: 17.03.2016
Сообщений: 445
Записей в блоге: 1
14.01.2020, 15:25
создать функции get_x set_x либо создать класс и переопределить __get__, __set__ методы
описано тут и тут
0
 Аватар для GulgDev
132 / 118 / 29
Регистрация: 09.07.2019
Сообщений: 1,071
14.01.2020, 15:26  [ТС]
Wolflind, это только для дескрипторов, и только определённых. А мне надо вообще.
0
 Аватар для Wolflind
127 / 107 / 31
Регистрация: 17.03.2016
Сообщений: 445
Записей в блоге: 1
14.01.2020, 15:31
ну как вариант попробовать через __getattr__ и __setattr__
0
 Аватар для GulgDev
132 / 118 / 29
Регистрация: 09.07.2019
Сообщений: 1,071
14.01.2020, 15:34  [ТС]
Wolflind, мне надо не с аттрибутами класса работать, а с изменением глобальных переменных!
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
14.01.2020, 15:40
Hyppoprogramm, во-первых, глобальные переменные использовать не следует.
Во-вторых, не надо искать хитрые пути там, где можно применить обычный, "кондовый" подход.

Простые переменные не заточены под то, что при их изменении выполнится что-то ещё. Так что вам нужно соответствующее усложнение.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
14.01.2020, 17:46
Чё, распарсить не получилось? Анализ кода Там же простые правила: ищем токен NAME, потом токен оператора присваивания…
Code
1
2
TokenInfo(type=1 (NAME), string='x', start=(1, 0), end=(1, 1), line='x = 7\n')
TokenInfo(type=52 (OP), string='=', start=(1, 2), end=(1, 3), line='x = 7\n')
Добавлено через 17 минут
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import io
from token import *
from tokenize import tokenize
 
text = '''\
x = 7
y = x * 2
z = y*x
a = x+y*z
b = a*3
c = a+b-y*z//x
print(input())
'''
result = set()
gen = tokenize(io.BytesIO(text.encode('utf-8')).readline)
token = next(gen) # ENCODING
while True:
    token = next(gen)
    if token.type == ENDMARKER:
        break
    if token.type == NAME:
        value = token.string
        token = next(gen)
        # <id> = …
        if token.type == OP and token.string == '=':
            result.add(value)
            token = next(gen)
    while token.type != NEWLINE:
        token = next(gen)        
print('vars =', result)
0
 Аватар для GulgDev
132 / 118 / 29
Регистрация: 09.07.2019
Сообщений: 1,071
14.01.2020, 18:09  [ТС]
Рыжий Лис, мне нужно чтобы во время программы при изменении значения переменной вызывалась функция.
Через tokenize,inspect и Thread попробовать?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.01.2020, 18:19
Начнем того что глобальных переменных стоит избегать.
А для конкретных целей есть специальный инструмент - свойства property
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
14.01.2020, 18:27
Для начала определитесь: либо вы запускаете код (который может быть синтаксически невалидным или зациклиться), либо вы парсите код и получаете от него полезные плюшки.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.01.2020, 18:29
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Settings:
   def __init__(self):
      self.__value = "init_value"
 
 
   def __value_changed(self,old_value,new_value):   
      print("value changed:",old_value,"to",new_value)
      
   def __set_value(self,new_value):
      self.__value_changed(self.__value,new_value)
      self.__value = new_value
            
   def __get_value(self):
      return self.__value
      
   value = property(__get_value,__set_value)   
   
   
settings = Settings();
settings.value = "new_value"
0
 Аватар для GulgDev
132 / 118 / 29
Регистрация: 09.07.2019
Сообщений: 1,071
14.01.2020, 18:37  [ТС]
Avazart, мне надо не это!

Добавлено через 17 секунд
Тоже самое но без settings.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.01.2020, 18:40
Цитата Сообщение от Hyppoprogramm Посмотреть сообщение
Тоже самое но без settings.
Думаю это не возможно.
(без модификации интерпретатора)
1
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
14.01.2020, 18:41
Avazart,
ТС хочет странного.... :-) Но вы не удивляйтесь - мы уже привыкли.

Вот что он хочет в режиме non-stop:



Hyppoprogramm,
Нет такого хука.
Реализовывайте.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
14.01.2020, 18:54
Цитата Сообщение от Garry Galler Посмотреть сообщение
Вот что он хочет в режиме non-stop:
Проще "интерпретатор" написать:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import io
from token import *
from tokenize import tokenize
 
text = '''\
x = 7
y = x * 2
x = 5
z = y*x
a = x+y*z
b = a*3
c = a+b-y*z//x
'''
g, l = {}, {}
gen = tokenize(io.BytesIO(text.encode('utf-8')).readline)
token = next(gen) # ENCODING
while True:
    token = next(gen)
    if token.type == ENDMARKER:
        break
    if token.type == NAME:
        value = token.string
        token = next(gen)
        # <id> = …
        if token.type == OP and token.string == '=':
            l_old = l.copy()
            exec(token.line, g, l)
            print('var {} = {} (old={})'.format(value, l[value], l_old.get(value)))
            token = next(gen)
    while token.type != NEWLINE:
        token = next(gen)
Code
1
2
3
4
5
6
7
var x = 7 (old=None)
var y = 14 (old=None)
var x = 5 (old=7)
var z = 70 (old=None)
var a = 985 (old=None)
var b = 2955 (old=None)
var c = 3744 (old=None)
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.01.2020, 18:56
Кстати можно использовать еще @classproperty тогда будет без объекта.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
14.01.2020, 19:19
lol:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ cat 1.py
x = 7
y = x * 2
x = 5
z = y*x
a = x+y*z
b = a*3
c = a+b-y*z//x
$ python3 -m pdb 1.py
> /home/fox/1.py(1)<module>()
-> x = 7
(Pdb) s
> /home/fox/1.py(2)<module>()
-> y = x * 2
(Pdb) locals()['x']
7
(Pdb)
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
14.01.2020, 19:27
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Проще "интерпретатор" написать
Если он парсит код, то да. А если запускает - парсер("интерпретатор") тут никак не поможет.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
14.01.2020, 19:30
ТС так и не ответил на мой вопрос: парсит он код или запускает.

Я почти не удивлюсь, если ТС пишет тестирующую систему для кода на питоне…
0
14.01.2020, 19:36

Не по теме:

Цитата Сообщение от Рыжий Лис Посмотреть сообщение
если ТС пишет тестирующую систему для кода на питоне
Зря я ему как-то назвал слово "хук".
Не за горами тема "хук на постановку хука без установки хука"

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.01.2020, 19:36
Помогаю со студенческими работами здесь

Cx_freeze python error in main script как исправить- Python
Пытался создать из .py .exe , но при запуске .exe получаю ошибку вот код setup.py from cx_Freeze import setup, Executable import os ...

Запуск скрипта написанного на python на windows, где не установлен python
Не запускается скрипт на Windows, где не установлен python. Команда в коде на выполнение написана так: def Adminnewpriglash(): ...

Как из Python скрипта выполнить другой python скрипт?
Как из Python скрипта выполнить другой python скрипт? Если он находится в той же папке но нужно передать еще передать скрипту аргументы.

Хук
MSG msg; while(GetMessage(&amp;msg,NULL,0,0)) TranslateMessage(&amp;msg), DispatchMessage(&amp;msg); switch(msg.wParam) { case WM_LBUTTONUP:...

Хук
Добрый день. Питаюсь отправить админу письмо при публикации поста пример ( add_action('publish_post', 'Моя функцыя')). При публикации поста...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru