Ошибки Python
Предварительно скомпилированные библиотеки
Хотя это и не является общепринятой практикой, аддоны Python могут распространяться с собственными предварительно скомпилированными библиотеками. В отличие от обычных скриптов Python, они не переносятся между разными платформами.
Возможно, библиотека несовместима с вашей установкой Blender (попытка загрузить библиотеку, созданную для другой версии Python, или загрузка 32-битной библиотеки в 64-битной системе).
Если аддон содержит файлы .pyd
или .so
, убедитесь, что дистрибутив совместим с вашей операционной системой.
Специфично для платформы
Windows
Смешанные библиотеки Python (DLLs)
Если Python выдает ошибки или у вас есть аддон, который при включении выходит из строя с ошибкой, например: ... не является допустимым приложением Win32.
.
Это может быть вызвано некоторой несогласованностью в библиотеках Python. Хотя Blender поставляется с собственным интерпретатором Python, дублирование несовместимых библиотек может вызвать проблемы.
Чтобы узнать, какая библиотека Python вызвала проблему, проверьте сообщение об ошибке.
Обычно об этом сообщается где-то в нижней строке обратной трассировки. Как видно из приведенной выше ошибки, проблема возникает при попытке импортировать _socket
. Это соответствует файлу с именем _socket.py
или _socket.pyd
.
To help troubleshoot this problem, the following script can be pasted into the Text editor and run to check for duplicate libraries in your search path. (The output will show in Command Line Window.)
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)