Ошибки Python#
Предварительно скомпилированные библиотеки#
Хотя это и не является общепринятой практикой, аддоны Python могут распространяться с собственными предварительно скомпилированными библиотеками. В отличие от обычных скриптов Python, они не переносятся между разными платформами.
Возможно, библиотека несовместима с вашей установкой Blender (попытка загрузить библиотеку, созданную для другой версии Python, или загрузка 32-битной библиотеки в 64-битной системе).
Если аддон содержит файлы .pyd
или .so
, убедитесь, что дистрибутив совместим с вашей операционной системой.
Специфично для платформы#
Windows#
Смешанные библиотеки Python (DLLs)#
Если Python выдает ошибки или у вас есть аддон, который при включении выходит из строя с ошибкой, например: ... не является допустимым приложением Win32.
.
Это может быть вызвано некоторой несогласованностью в библиотеках 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)