Chyby jazyka Python#

Predkompilované knižnice#

Hoci to nie je bežná prax, doplnky Pythonu môžu byť distribuované s vlastnými predkompilovanými knižnicami. Na rozdiel od bežných skriptov Pythonu nie sú tieto prenosné medzi rôznymi platformami.

Je možné, že knižnica nie je kompatibilná s vašou inštaláciou Blenderu (pokus o načítanie knižnice vytvorenej pre inú verziu Pythonu alebo načítanie 32-bitovej knižnice v 64-bitovom systéme).

Ak doplnok obsahuje súbory .pyd alebo .so, skontrolujte, či je distribúcia kompatibilná s vaším operačným systémom.

Špecifická platforma#

Windows#

Zmiešané knižnice Pythonu (DLL)#

Ak Python vyhlasuje chyby alebo máte doplnok, ktorý po zapnutí zlyhá s chybou, napr.: ... je neplatná Win32 aplikácia..

../_images/troubleshooting_python_traceback.png

Spätné sledovanie v jazyku Python.#

Môže to byť spôsobené určitou nekonzistenciou v knižniciach Python. Hoci Blender obsahuje vlastný interpret Pythonu, problémy môžu spôsobiť duplicitné, nekompatibilné knižnice.

Ak chcete zistiť, ktorá knižnica Pythonu spôsobila problém, skontrolujte chybovú správu.

Zvyčajne sa to hlási niekde na spodnom riadku spätného sledovania. Pri vyššie uvedenej chybe vidíte, že problém je spôsobený pri pokuse o import _socket. To zodpovedá buď súboru s názvom _socket.py alebo _socket.pyd.

Pri riešení tohto problému vám pomôže nasledujúci skript, ktorý môžete vložiť do textového editora a spustiť na kontrolu duplicitných knižníc v ceste vyhľadávania. (Výstup sa zobrazí v okne príkazového riadku)

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)