Помилки щодо Python – Python Errors

Передкомпільовані Бібліотеки – Precompiled Libraries

Хоча це не є поширеною практикою, додатки Python можуть розповсюджуватися з їх власними передкомпільованими бібліотеками. На відміну від звичайних скриптів на Python, бібліотеки є переносними між різними платформами.

Можливо, що певна бібліотека є несумісною з вашою інсталяцією Blender’а (намагається завантажити бібліотеку, побудовану для іншої версії Python, або завантажити 32-бітну бібліотеку на 64-бітній системі).

Якщо теки додатків містять файли .pyd або .so, то перевірте, чи цей дистрибутив є сумісним із вашою операційною системою.

Специфічно для Платформи – Platform Specific

Windows

Mixed Python Libraries (DLLs)

Якщо Python піднімає помилки або ви маєте додаток, що просто падає, коли вмикається, з помилкою: «… не є дійсним застосунком Win32» – ... is not a valid Win32 application..

../_images/troubleshooting_python_traceback.png

Відслідження – traceback Python.

Це може спричинятися деякою суперечністю у бібліотеках Python. Хоча Blender має у своєму пакеті власний вбудований інтерпретатор Python, однак, дубльовані, несумісні бібліотеки можуть спричиняти проблеми.

Для виявлення, яка бібліотека Python спричинила проблему, перевірте повідомлення про помилку.

Це зазвичай повідомляється десь біля нижнього рядка відслідження. На ілюстрації вище ви можете побачити, що проблема виникає при спробі імпортувати _socket. Це відповідає або файлу з іменем _socket.py або _socket.pyd.

Для вирішення цієї проблеми наступний скрипт може бути вставлено у Редактор Тексту – Text Editor та запущено для перевірки на дублікати бібліотек за вашим шляхом пошуку. (Вивід буде показано у вікні командного рядка – 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)