Fix bl_load_py_modules test
- scripts that execute directly need to include their basedir in the sys.path - modules which are in a directory without an __init__.py weren't importing.
This commit is contained in:
@@ -38,6 +38,12 @@ BLACKLIST = {
|
|||||||
'io_import_dxf', # Because of cydxfentity.so dependency
|
'io_import_dxf', # Because of cydxfentity.so dependency
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Some modules need to add to the `sys.path`.
|
||||||
|
MODULE_SYS_PATHS = {
|
||||||
|
# Runs in a Python subprocess, so its expected its basedir can be imported.
|
||||||
|
"io_blend_utils.blendfile_pack": ".",
|
||||||
|
}
|
||||||
|
|
||||||
if not bpy.app.build_options.freestyle:
|
if not bpy.app.build_options.freestyle:
|
||||||
BLACKLIST.add("render_freestyle_svg")
|
BLACKLIST.add("render_freestyle_svg")
|
||||||
|
|
||||||
@@ -46,6 +52,34 @@ BLACKLIST_DIRS = (
|
|||||||
) + tuple(addon_utils.paths()[1:])
|
) + tuple(addon_utils.paths()[1:])
|
||||||
|
|
||||||
|
|
||||||
|
def module_names_recursive(mod_dir, *, parent=None):
|
||||||
|
"""
|
||||||
|
a version of bpy.path.module_names that includes non-packages
|
||||||
|
"""
|
||||||
|
|
||||||
|
is_package = os.path.exists(os.path.join(mod_dir, "__init__.py"))
|
||||||
|
|
||||||
|
for n in os.listdir(mod_dir):
|
||||||
|
if not n.startswith((".", "_")):
|
||||||
|
submod_full = os.path.join(mod_dir, n)
|
||||||
|
if os.path.isdir(submod_full):
|
||||||
|
if not parent:
|
||||||
|
subparent = n
|
||||||
|
else:
|
||||||
|
subparent = parent + "." + n
|
||||||
|
yield from module_names_recursive(submod_full, parent=subparent)
|
||||||
|
elif n.endswith(".py") and is_package is False:
|
||||||
|
submod = n[:-3]
|
||||||
|
if parent:
|
||||||
|
submod = parent + "." + submod
|
||||||
|
yield submod, submod_full
|
||||||
|
|
||||||
|
|
||||||
|
def module_names_all(mod_dir):
|
||||||
|
yield from bpy.path.module_names(mod_dir)
|
||||||
|
yield from module_names_recursive(mod_dir)
|
||||||
|
|
||||||
|
|
||||||
def addon_modules_sorted():
|
def addon_modules_sorted():
|
||||||
modules = addon_utils.modules({})
|
modules = addon_utils.modules({})
|
||||||
modules[:] = [mod for mod in modules if not mod.__file__.startswith(BLACKLIST_DIRS)]
|
modules[:] = [mod for mod in modules if not mod.__file__.startswith(BLACKLIST_DIRS)]
|
||||||
@@ -130,12 +164,22 @@ def load_modules():
|
|||||||
filepath = m.__file__
|
filepath = m.__file__
|
||||||
if os.path.basename(filepath).startswith("__init__."):
|
if os.path.basename(filepath).startswith("__init__."):
|
||||||
mod_dir = os.path.dirname(filepath)
|
mod_dir = os.path.dirname(filepath)
|
||||||
for submod, submod_full in bpy.path.module_names(mod_dir):
|
for submod, submod_full in module_names_all(mod_dir):
|
||||||
# fromlist is ignored, ugh.
|
# fromlist is ignored, ugh.
|
||||||
mod_name_full = m.__name__ + "." + submod
|
mod_name_full = m.__name__ + "." + submod
|
||||||
|
|
||||||
|
sys_path_back = sys.path[:]
|
||||||
|
|
||||||
|
sys.path.extend([
|
||||||
|
os.path.normpath(os.path.join(mod_dir, f))
|
||||||
|
for f in MODULE_SYS_PATHS.get(mod_name_full, ())
|
||||||
|
])
|
||||||
|
|
||||||
__import__(mod_name_full)
|
__import__(mod_name_full)
|
||||||
mod_imp = sys.modules[mod_name_full]
|
mod_imp = sys.modules[mod_name_full]
|
||||||
|
|
||||||
|
sys.path[:] = sys_path_back
|
||||||
|
|
||||||
# check we load what we ask for.
|
# check we load what we ask for.
|
||||||
assert(os.path.samefile(mod_imp.__file__, submod_full))
|
assert(os.path.samefile(mod_imp.__file__, submod_full))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user