Merge pull request #2054 from pypeclub/PYPE-1316_Validation-on-OpenPype-start

General: Startup validations
This commit is contained in:
Jakub Trllo 2021-09-22 14:35:22 +02:00 committed by GitHub
commit d0a283227b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 80 additions and 34 deletions

View file

@ -1,34 +0,0 @@
import pyblish.api
import os
import subprocess
import openpype.lib
try:
import os.errno as errno
except ImportError:
import errno
class ValidateFFmpegInstalled(pyblish.api.ContextPlugin):
"""Validate availability of ffmpeg tool in PATH"""
order = pyblish.api.ValidatorOrder
label = 'Validate ffmpeg installation'
optional = True
def is_tool(self, name):
try:
devnull = open(os.devnull, "w")
subprocess.Popen(
[name], stdout=devnull, stderr=devnull
).communicate()
except OSError as e:
if e.errno == errno.ENOENT:
return False
return True
def process(self, context):
ffmpeg_path = openpype.lib.get_ffmpeg_tool_path("ffmpeg")
self.log.info("ffmpeg path: `{}`".format(ffmpeg_path))
if self.is_tool("{}".format(ffmpeg_path)) is False:
self.log.error("ffmpeg not found in PATH")
raise RuntimeError('ffmpeg not installed.')

View file

@ -96,6 +96,7 @@ Attributes:
import os
import re
import sys
import platform
import traceback
import subprocess
import site
@ -339,6 +340,80 @@ def set_modules_environments():
os.environ.update(env)
def is_tool(name):
try:
import os.errno as errno
except ImportError:
import errno
try:
devnull = open(os.devnull, "w")
subprocess.Popen(
[name], stdout=devnull, stderr=devnull
).communicate()
except OSError as exc:
if exc.errno == errno.ENOENT:
return False
return True
def _startup_validations():
"""Validations before OpenPype starts."""
try:
_validate_thirdparty_binaries()
except Exception as exc:
if os.environ.get("OPENPYPE_HEADLESS_MODE"):
raise
import tkinter
from tkinter.messagebox import showerror
root = tkinter.Tk()
root.attributes("-alpha", 0.0)
root.wm_state("iconic")
if platform.system().lower() != "windows":
root.withdraw()
showerror(
"Startup validations didn't pass",
str(exc)
)
root.withdraw()
sys.exit(1)
def _validate_thirdparty_binaries():
"""Check existence of thirdpart executables."""
low_platform = platform.system().lower()
binary_vendors_dir = os.path.join(
os.environ["OPENPYPE_ROOT"],
"vendor",
"bin"
)
error_msg = (
"Missing binary dependency {}. Please fetch thirdparty dependencies."
)
# Validate existence of FFmpeg
ffmpeg_dir = os.path.join(binary_vendors_dir, "ffmpeg", low_platform)
if low_platform == "windows":
ffmpeg_dir = os.path.join(ffmpeg_dir, "bin")
ffmpeg_executable = os.path.join(ffmpeg_dir, "ffmpeg")
if not is_tool(ffmpeg_executable):
raise RuntimeError(error_msg.format("FFmpeg"))
# Validate existence of OpenImageIO (not on MacOs)
if low_platform != "darwin":
oiio_tool_path = os.path.join(
binary_vendors_dir,
"oiio",
low_platform,
"oiiotool"
)
if not is_tool(oiio_tool_path):
raise RuntimeError(error_msg.format("OpenImageIO"))
def _process_arguments() -> tuple:
"""Process command line arguments.
@ -767,6 +842,11 @@ def boot():
# ------------------------------------------------------------------------
os.environ["OPENPYPE_ROOT"] = OPENPYPE_ROOT
# ------------------------------------------------------------------------
# Do necessary startup validations
# ------------------------------------------------------------------------
_startup_validations()
# ------------------------------------------------------------------------
# Play animation
# ------------------------------------------------------------------------