Джанго 1.11.7 - Компрессор Джанго - аргумент 5:: ожидаемый экземпляр LP_OVERLAPPED вместо указателя на OVERLAPPED - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь запустить существующий проект Django 1.11.7 (Python 3.5) на моем компьютере с Windows 10.После настройки среды я теперь вижу домашнюю страницу после запуска приложения, но на любой внутренней странице, которую я посещаю, появляется следующая ошибка:

argument 5: <class 'TypeError'>: expected LP_OVERLAPPED instance instead of pointer to OVERLAPPED

Я проследилэто к вызову compress.py (компрессор Django) для некоторых сжатых файлов CSS, к некоторому коду блокировки файла win32 во внутреннем файле django.core, в частности к этой строке: https://github.com/django/django/blob/master/django/core/files/locks.py#L86 (UnlockFileEx в фрагменте ниже).

class OVERLAPPED(Structure):
    _anonymous_ = ['_offset_union']
    _fields_ = [
        ('Internal', ULONG_PTR),
        ('InternalHigh', ULONG_PTR),
        ('_offset_union', _OFFSET_UNION),
        ('hEvent', HANDLE)]

LPOVERLAPPED = POINTER(OVERLAPPED)
....
def lock(f, flags):
    hfile = msvcrt.get_osfhandle(_fd(f))
    overlapped = OVERLAPPED()
    ret = LockFileEx(hfile, flags, 0, 0, 0xFFFF0000, byref(overlapped))
    return bool(ret)

def unlock(f):
    hfile = msvcrt.get_osfhandle(_fd(f))
    overlapped = OVERLAPPED()
    ret = UnlockFileEx(hfile, 0, 0, 0xFFFF0000, byref(overlapped))
    return bool(ret)

Странно то, что методы LockFileEx и UnlockFileEx вызываются на домашней странице без ошибок.Проверка локальных пользователей как в успешных, так и в неудачных вызовах ничего не выявила.

Трассировка стека на случай, если это поможет (отредактирован верхний стек):

  File "C:\x\env\lib\site-packages\compressor\templatetags\compress.py", line 127, in render
    return self.render_compressed(context, self.kind, self.mode, forced=forced)
  File "C:\x\env\lib\site-packages\compressor\templatetags\compress.py", line 103, in render_compressed
    rendered_output = compressor.output(mode, forced=forced)
  File "C:\x\env\lib\site-packages\compressor\css.py", line 49, in output
    ret.append(subnode.output(*args, **kwargs))
  File "C:\x\env\lib\site-packages\compressor\css.py", line 51, in output
    return super(CssCompressor, self).output(*args, **kwargs)
  File "C:\x\env\lib\site-packages\compressor\base.py", line 292, in output
    output = '\n'.join(self.filter_input(forced))
  File "C:\x\env\lib\site-packages\compressor\base.py", line 232, in filter_input
    for hunk in self.hunks(forced):
  File "C:\x\env\lib\site-packages\compressor\base.py", line 215, in hunks
    basename=basename)
  File "C:\x\env\lib\site-packages\compressor\base.py", line 307, in handle_output
    return output_func(mode, content, forced, basename)
  File "C:\x\env\lib\site-packages\compressor\base.py", line 319, in output_file
    self.storage.save(new_filepath, ContentFile(content.encode(self.charset)))
  File "C:\x\env\lib\site-packages\django\core\files\storage.py", line 54, in save
    return self._save(name, content)
  File "C:\x\env\lib\site-packages\django\core\files\storage.py", line 357, in _save
    locks.unlock(fd)
  File "C:\x\env\lib\site-packages\django\core\files\locks.py", line 86, in unlock
    ret = UnlockFileEx(hfile, 0, 0, 0xFFFF0000, byref(overlapped))

Появляются файлы, которые работают сБлокировка / разблокировка являются статическими файлами CSS.И JS, и LESS являются теми, кто выбрасывает указанное выше исключение.Похоже, что проект использует yuglify для фильтров CSS и JS, если это помогает.

1 Ответ

0 голосов
/ 15 мая 2018

В моем случае это произошло из-за конфликта с пакетом youtube-dl, имеющим классы, переменные и методы с аналогичными именами, как у пакета django-compress. Я смог подтвердить это, «взломав» имена различных токенов в обоих случаях, что привело к ошибке argument 5: <class 'TypeError'>: expected LP_OVERLAPPED2 instance instead of pointer to OVERLAPPED3

Я удалил пакет youtube-dl из своей среды на данный момент как временное решение для его запуска в моей локальной среде разработчика.

...