Ошибки Python#

Предварительно скомпилированные библиотеки#

Хотя это и не является общепринятой практикой, аддоны Python могут распространяться с собственными предварительно скомпилированными библиотеками. В отличие от обычных скриптов Python, они не переносятся между разными платформами.

Возможно, библиотека несовместима с вашей установкой Blender (попытка загрузить библиотеку, созданную для другой версии Python, или загрузка 32-битной библиотеки в 64-битной системе).

Если аддон содержит файлы .pyd или .so, убедитесь, что дистрибутив совместим с вашей операционной системой.

Специфично для платформы#

Windows#

Смешанные библиотеки Python (DLLs)#

Если Python выдает ошибки или у вас есть аддон, который при включении выходит из строя с ошибкой, например: ... не является допустимым приложением Win32..

../_images/troubleshooting_python_traceback.png

Обратная трассировка Python.#

Это может быть вызвано некоторой несогласованностью в библиотеках Python. Хотя Blender поставляется с собственным интерпретатором Python, дублирование несовместимых библиотек может вызвать проблемы.

Чтобы узнать, какая библиотека Python вызвала проблему, проверьте сообщение об ошибке.

Обычно об этом сообщается где-то в нижней строке обратной трассировки. Как видно из приведенной выше ошибки, проблема возникает при попытке импортировать _socket. Это соответствует файлу с именем _socket.py или _socket.pyd.

Чтобы устранить эту проблему, можно вставить следующий скрипт в текстовый редактор и запустить его для проверки наличия повторяющихся библиотек в пути поиска. (Вывод будет показан в окне командной строки.)

import os
import sys

# Change this based on the library you wish to test
test_lib = "_socket.pyd"

def GetSystemDirectory():
    from ctypes import windll, create_string_buffer, sizeof
    GetSystemDirectory = windll.kernel32.GetSystemDirectoryA
    buffer = create_string_buffer(260)
    GetSystemDirectory(buffer, sizeof(buffer))
    return os.fsdecode(buffer.value)

def library_search_paths():
    return (
        # Windows search paths
        os.path.dirname(sys.argv[0]),
        os.getcwd(),
        GetSystemDirectory(),
        os.environ["WINDIR"],  # GetWindowsDirectory
        *os.environ["PATH"].split(";"),

        # regular Python search paths
        *sys.path,
        )

def check_library_duplicate(libname):
    paths = [p for p in library_search_paths()
             if os.path.exists(os.path.join(p, libname))]

    print("Library %r found in %d locations:" % (libname, len(paths)))
    for p in paths:
        print("- %r" % p)

check_library_duplicate(test_lib)