Python 错误

预编译库

虽然不是很常见的做法,但是 Python 插件可以使用他们自己的预编译库进行分发。与常规 Python 脚本不同,这些脚本在不同平台之间不可移植。

该库可能与您的 Blender 安装不兼容(尝试加载为不同版本的 Python 构建的库,或在 64 位系统上加载 32 位库)。

如果插件包含 .pyd.so 文件,请检查该分发版本是否与您的操作系统兼容。

平台特定

Windows

混合的 Python 库(DLL)

如果 Python 发生错误,或者您的插件在启用错误时失败,例如:... 不是有效的Win32应用程序

../_images/troubleshooting_python_traceback.png

Python traceback 模块。

这可能是由于 Python 库中的某些不一致造成的。虽然 Blender 附带了自己捆绑的 Python 解释器,但重复的、不兼容的库可能会导致问题。

要找出哪个 Python 库导致问题,请检查错误消息。

报告通常在 traceback 的底部行附近。有了上面的错误,你会发现问题是在尝试导入 _socket 时引起的。这对应于名为 _socket.py_socket.pyd 的文件。

为了帮助解决这个问题,可以将以下脚本粘贴到文本编辑器中并运行,以检查搜索路径中的重复库。(输出结果将显示在命令行窗口中。)

  1. import os
  2. import sys
  3. # Change this based on the library you wish to test
  4. test_lib = "_socket.pyd"
  5. def GetSystemDirectory():
  6. from ctypes import windll, create_string_buffer, sizeof
  7. GetSystemDirectory = windll.kernel32.GetSystemDirectoryA
  8. buffer = create_string_buffer(260)
  9. GetSystemDirectory(buffer, sizeof(buffer))
  10. return os.fsdecode(buffer.value)
  11. def library_search_paths():
  12. return (
  13. # Windows search paths
  14. os.path.dirname(sys.argv[0]),
  15. os.getcwd(),
  16. GetSystemDirectory(),
  17. os.environ["WINDIR"], # GetWindowsDirectory
  18. *os.environ["PATH"].split(";"),
  19. # regular Python search paths
  20. *sys.path,
  21. )
  22. def check_library_duplicate(libname):
  23. paths = [p for p in library_search_paths()
  24. if os.path.exists(os.path.join(p, libname))]
  25. print("Library %r found in %d locations:" % (libname, len(paths)))
  26. for p in paths:
  27. print("- %r" % p)
  28. check_library_duplicate(test_lib)