Python: RecursionError
Каждый раз, запуская вот такой код:
from _ctypes import FUNCFLAG_STDCALL
from _ctypes import CFuncPtr
from _ctypes import LoadLibrary
from _ctypes import Structure, pointer
from _ctypes import _SimpleCData
class c_long(_SimpleCData):
_type_ = "l"
class c_int(_SimpleCData):
_type_ = 'i'
class WinDLL(object):
def __init__(self, name):
import nt
LibraryLoader = LoadLibrary(name, nt._LOAD_LIBRARY_SEARCH_DEFAULT_DIRS)
class WinDLL_Func(CFuncPtr):
_flags_ = FUNCFLAG_STDCALL
_restype_ = c_int
self.WinDLL_Func = WinDLL_Func
def __getattr__(self, name):
return self.WinDLL_Func((name, self))
class POINT(Structure):
_fields_ = [('x', c_long),
('y', c_long)]
pointerpoint = pointer(POINT())
user32 = WinDLL('user32')
user32.GetCursorPos(pointerpoint)
print('({}, {})'.format(pointerpoint[0].x, pointerpoint[0].y))
Получаю ошибку
Traceback (most recent call last):
File "C:\Users\user\Desktop\PyG.py", line 25, in <module>
user32.GetCursorPos(pointer(POINT()))
File "C:\Users\user\Desktop\PyG.py", line 18, in __getattr__
return self.WinDLL_Func((name, self))
File "C:\Users\user\Desktop\PyG.py", line 18, in __getattr__
return self.WinDLL_Func((name, self))
File "C:\Users\user\Desktop\PyG.py", line 18, in __getattr__
return self.WinDLL_Func((name, self))
[Previous line repeated 510 more times]
RecursionError: maximum recursion depth exceeded while calling a Python object
Скажите пожалуйста, как исправить данную ошибку?
Ответы (2 шт):
Автор решения: Victor VosMottor
→ Ссылка
Понятия не имею, что делает этот код...
Но вот такое например решение (только будьте острожны, не делайте LIMIT слишком большим!):
import sys
LIMIT = 1000
sys.setrecursionlimit(LIMIT) # or more than 1000...
Я на линуксе, так что попробовать не могу...
И кстати если это по сути функция без условия выхода типа:
def f():
...
f()
То нет смысла пытаться делать, то что я предложил, лучше скажите что вы хотите сделать?
Автор решения: Aleksey Bogomagkov
→ Ссылка
Я забыл про ещё одну глобальную переменную - _handle.
LibraryLoader = LoadLibrary(name, nt._LOAD_LIBRARY_SEARCH_DEFAULT_DIRS)
Нужно заменить на
self._handle = LoadLibrary(name, nt._LOAD_LIBRARY_SEARCH_DEFAULT_DIRS)
В результате получается, то что я и задумал: DLL библиотека user32 передаёт данные о позиции курсора в указатель, а затем данные выводятся на экран