BBIM startup error handler - message on python version mismatch

Example - https://i.imgur.com/U5CBdqU.png
Logs (only startup error logs) now also have information about binary python version and binary filename.
This commit is contained in:
Andrej730
2024-07-16 17:09:13 +05:00
parent c0635afb64
commit 010f854a07
+42 -3
View File
@@ -28,12 +28,14 @@ IN_BLENDER = sys.modules.get("bpy", None)
if IN_BLENDER: if IN_BLENDER:
import bpy import bpy
import addon_utils import addon_utils
import re
import platform import platform
import traceback import traceback
import webbrowser import webbrowser
from collections import deque from collections import deque
from pathlib import Path from pathlib import Path
from typing import Union from typing import Union, Any
# NOTE: bl_info is superseded by blender_manifest.toml # NOTE: bl_info is superseded by blender_manifest.toml
@@ -108,7 +110,33 @@ if IN_BLENDER:
# Process *.pth in /libs/site/packages to setup globally importable modules # Process *.pth in /libs/site/packages to setup globally importable modules
# This is 3 levels deep as required by the static RPATH of ../../ from dependencies taken from Anaconda # This is 3 levels deep as required by the static RPATH of ../../ from dependencies taken from Anaconda
# site.addsitedir(os.path.join(os.path.dirname(os.path.realpath(__file__)), "libs", "site", "packages")) # site.addsitedir(os.path.join(os.path.dirname(os.path.realpath(__file__)), "libs", "site", "packages"))
sys.path.insert(0, os.path.join(os.path.dirname(os.path.realpath(__file__)), "libs", "site", "packages")) site_path = Path(__file__).parent.resolve() / "libs" / "site" / "packages"
sys.path.insert(0, str(site_path))
def get_binary_info() -> dict[str, Any]:
info = {}
lib = site_path / "ifcopenshell"
binary = next((i for i in lib.glob("_ifcopenshell_wrapper.*")), None)
if binary is None:
info["binary_error"] = "Couldn't find ifcopenshell wrapper binary."
return info
# Examples:
# _ifcopenshell_wrapper.cp311-win_amd64.pyd
# _ifcopenshell_wrapper.cpython-311-darwin.so
# _ifcopenshell_wrapper.cpython-311-x86_64-linux-gnu.so
binary = binary.name
info["binary_file_name"] = binary
pattern = re.compile(r"cp(\d+)|cpython-(\d+)")
match = pattern.search(binary)
if not match:
info["binary_error"] = f"Couldn't parse binary version from '{binary}'."
return info
version = match.group(1) or match.group(2)
version = f"{version[0]}.{version[1:]}"
info["binary_python_version"] = version
return info
try: try:
import git import git
@@ -187,6 +215,15 @@ if IN_BLENDER:
if commit_hash := info.get("blenderbim_commit_hash"): if commit_hash := info.get("blenderbim_commit_hash"):
blenderbim_version += f"-{commit_hash}" blenderbim_version += f"-{commit_hash}"
box.label(text=f"Python {py} BBIM {info['blenderbim_version']}", icon="SCRIPTPLUGINS") box.label(text=f"Python {py} BBIM {info['blenderbim_version']}", icon="SCRIPTPLUGINS")
binary_py = get_binary_info().get("binary_python_version")
if binary_py and py != binary_py:
box.separator()
box.label(text="BlenderBIM installed for wrong Python version.")
box.label(text=f"Expected: {py}. Got: {binary_py}.")
box.label(text="Try reinstalling with the correct Python version.")
box.label(text="You can download correct version below.")
layout.operator("bim.copy_debug_information", text="Copy Error Message To Clipboard") layout.operator("bim.copy_debug_information", text="Copy Error Message To Clipboard")
op = layout.operator("bim.open_uri", text="How Can I Fix This?") op = layout.operator("bim.open_uri", text="How Can I Fix This?")
op.uri = "https://docs.blenderbim.org/users/troubleshooting.html#installation-issues" op.uri = "https://docs.blenderbim.org/users/troubleshooting.html#installation-issues"
@@ -221,7 +258,9 @@ if IN_BLENDER:
bl_description = "Copies debugging information to your clipboard for use in bugreports" bl_description = "Copies debugging information to your clipboard for use in bugreports"
def execute(self, context): def execute(self, context):
info = format_debug_info(get_debug_info()) info = get_debug_info()
info.update(get_binary_info())
info = format_debug_info(info)
context.window_manager.clipboard = info context.window_manager.clipboard = info
return {"FINISHED"} return {"FINISHED"}