From b8730324c7afe547d1f5ffed98ce4b6f16a3eb6c Mon Sep 17 00:00:00 2001 From: Yann Lanthony Date: Wed, 1 Aug 2018 19:40:37 +0200 Subject: [PATCH] [setup] add 'setupEnvironment' for setting-up standalone configuration * setup environment vars to work in a prebuilt, standalone configuration * call 'setupEnvironment' at the beginning of executables --- bin/meshroom_compute | 3 ++ bin/meshroom_photogrammetry | 6 +-- bin/meshroom_status | 3 ++ bin/meshroom_submit | 3 ++ meshroom/__init__.py | 82 +++++++++++++++++++++++++++++++++++++ meshroom/ui/__main__.py | 6 ++- 6 files changed, 98 insertions(+), 5 deletions(-) diff --git a/bin/meshroom_compute b/bin/meshroom_compute index 65e52b38..f9fe21a0 100755 --- a/bin/meshroom_compute +++ b/bin/meshroom_compute @@ -1,6 +1,9 @@ #!/usr/bin/env python import argparse +import meshroom +meshroom.setupEnvironment() + import meshroom.core.graph from meshroom.core.node import Status diff --git a/bin/meshroom_photogrammetry b/bin/meshroom_photogrammetry index 7568fb53..40dba655 100755 --- a/bin/meshroom_photogrammetry +++ b/bin/meshroom_photogrammetry @@ -1,12 +1,12 @@ #!/usr/bin/env python import argparse -import os -import meshroom.core +import meshroom +meshroom.setupEnvironment() + import meshroom.core.graph from meshroom import multiview - parser = argparse.ArgumentParser(description='Launch the full photogrammetry pipeline.') parser.add_argument('--input', metavar='FOLDER', type=str, default='', diff --git a/bin/meshroom_status b/bin/meshroom_status index 1abf33b9..6d5efcb4 100755 --- a/bin/meshroom_status +++ b/bin/meshroom_status @@ -3,6 +3,9 @@ import argparse import os from pprint import pprint +import meshroom +meshroom.setupEnvironment() + import meshroom.core.graph parser = argparse.ArgumentParser(description='Query the status of nodes in a Graph of processes.') diff --git a/bin/meshroom_submit b/bin/meshroom_submit index a6e2ef7c..f8ab606f 100755 --- a/bin/meshroom_submit +++ b/bin/meshroom_submit @@ -1,6 +1,9 @@ #!/usr/bin/env python import argparse +import meshroom +meshroom.setupEnvironment() + import meshroom.core.graph parser = argparse.ArgumentParser(description='Submit a Graph of processes on renderfarm.') diff --git a/meshroom/__init__.py b/meshroom/__init__.py index 461c9ba9..1ab483b7 100644 --- a/meshroom/__init__.py +++ b/meshroom/__init__.py @@ -1,14 +1,96 @@ __version__ = "2018.1" +import logging from enum import Enum + class Backend(Enum): STANDALONE = 1 PYSIDE = 2 + backend = Backend.STANDALONE + def useUI(): global backend backend = Backend.PYSIDE + +def setupEnvironment(): + """ + Setup environment for Meshroom to work in a prebuilt, standalone configuration. + + Use 'MESHROOM_INSTALL_DIR' to simulate standalone configuration with a path to a Meshroom installation folder. + + # Meshroom standalone structure + + - Meshroom/ + - aliceVision/ + - bin/ # runtime bundled binaries (exe + libs) + - share/ # resource files + - COPYING.md # AliceVision COPYING file + - cameraSensors.db # sensor database + - vlfeat_K80L3.tree # voctree file + - lib/ # Python lib folder + - qtPlugins/ + Meshroom # main executable + COPYING.md # Meshroom COPYING file + """ + + import os + import sys + + def addToEnvPath(var, val, index=-1): + """ + Add paths to the given environment variable. + + Args: + var (str): the name of the variable to add paths to + val (str or list of str): the path(s) to add + index (int): insertion index + """ + paths = os.environ.get(var, "").split(os.pathsep) + + if not isinstance(val, (list, tuple)): + val = [val] + + paths[index:index] = val + os.environ[var] = os.pathsep.join(paths) + + # detect if this is a frozen environment based on executable name + isStandalone = "python" not in os.path.basename(sys.executable).lower() + # setup root directory (override possible by setting "MESHROOM_INSTALL_DIR" environment variable) + rootDir = os.path.dirname(sys.executable) if isStandalone else os.environ.get("MESHROOM_INSTALL_DIR", None) + + if rootDir: + os.environ["MESHROOM_INSTALL_DIR"] = rootDir + + aliceVisionDir = os.path.join(rootDir, "aliceVision") + # default directories + aliceVisionBinDir = os.path.join(aliceVisionDir, "bin") + aliceVisionShareDir = os.path.join(aliceVisionDir, "share") + qtPluginsDir = os.path.join(rootDir, "qtPlugins") + sensorDBPath = os.path.join(aliceVisionShareDir, "cameraSensors.db") + voctreePath = os.path.join(aliceVisionShareDir, "vlfeat_K80L3.tree") + + env = { + 'PATH': aliceVisionBinDir, + 'LD_LIBRARY_PATH': aliceVisionBinDir, + 'QT_PLUGIN_PATH': [qtPluginsDir], + 'QML2_IMPORT_PATH': [os.path.join(qtPluginsDir, "qml")] + } + + for key, value in env.items(): + logging.info("Add to {}: {}".format(key, value)) + addToEnvPath(key, value, 0) + + variables = { + "ALICEVISION_SENSOR_DB": sensorDBPath, + "ALICEVISION_VOCTREE": voctreePath + } + + for key, value in variables.items(): + if key not in os.environ and os.path.exists(value): + logging.info("Set {}: {}".format(key, value)) + os.environ[key] = value diff --git a/meshroom/ui/__main__.py b/meshroom/ui/__main__.py index 4d43cdad..5914f1ad 100644 --- a/meshroom/ui/__main__.py +++ b/meshroom/ui/__main__.py @@ -1,10 +1,12 @@ import signal import sys - -from meshroom.ui.app import MeshroomApp +import meshroom if __name__ == "__main__": + meshroom.setupEnvironment() + signal.signal(signal.SIGINT, signal.SIG_DFL) + from meshroom.ui.app import MeshroomApp app = MeshroomApp(sys.argv) app.exec_()