Fel i Python

Förkompilerade bibliotek

Även om det inte är vanligt förekommande kan Python-tillägg distribueras med sina egna förkompilerade bibliotek. Till skillnad från vanliga Python-skript är dessa inte portabla mellan olika plattformar.

Det är möjligt att biblioteket inte är kompatibelt med din Blender-installation (försök att ladda ett bibliotek som är byggt för en annan version av Python, eller ladda ett 32-bitars bibliotek på ett 64-bitars system).

Om tillägget innehåller filerna .pyd eller .so bör du kontrollera att distributionen är kompatibel med ditt operativsystem.

Plattformsspecifika

Windows

Blandade Python-bibliotek (DLL:er)

Om Python ger upphov till fel eller om du har ett tillägg som bara misslyckas när det aktiveras med ett fel – t.ex.: … is not a valid Win32 application. – kan detta orsakas av någon inkonsekvens i Python-biblioteken. Även om Blender levereras med sin egen Python-tolk, kan dubbla, inkompatibla bibliotek orsaka problem.

../_images/troubleshooting_python_traceback.png

En Python-spårning.

Kontrollera felmeddelandet för att ta reda på vilket Python-bibliotek som orsakade problemet.

Detta rapporteras normalt någonstans runt den nedersta raden i spårningen. Med felet ovan ser du att problemet orsakas när du försöker importera _socket. Detta motsvarar antingen en fil med namnet _socket.py eller _socket.pyd.

För att hjälpa till att felsöka det här problemet kan följande skript klistras in i textredigeraren och köras för att kontrollera om det finns dubbla bibliotek i sökvägen. (Utdata visas i 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)