Merge pull request #4905 from Tilix4/feature/blender_python_launch_script

This commit is contained in:
Simone Barbieri 2023-06-01 15:58:50 +01:00 committed by GitHub
commit 722f227ebb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 117 additions and 0 deletions

View file

@ -0,0 +1,55 @@
from pathlib import Path
from openpype.lib import PreLaunchHook
class AddPythonScriptToLaunchArgs(PreLaunchHook):
"""Add python script to be executed before Blender launch."""
# Append after file argument
order = 15
app_groups = [
"blender",
]
def execute(self):
if not self.launch_context.data.get("python_scripts"):
return
# Add path to workfile to arguments
for python_script_path in self.launch_context.data["python_scripts"]:
self.log.info(
f"Adding python script {python_script_path} to launch"
)
# Test script path exists
python_script_path = Path(python_script_path)
if not python_script_path.exists():
self.log.warning(
f"Python script {python_script_path} doesn't exist. "
"Skipped..."
)
continue
if "--" in self.launch_context.launch_args:
# Insert before separator
separator_index = self.launch_context.launch_args.index("--")
self.launch_context.launch_args.insert(
separator_index,
"-P",
)
self.launch_context.launch_args.insert(
separator_index + 1,
python_script_path.as_posix(),
)
else:
self.launch_context.launch_args.extend(
["-P", python_script_path.as_posix()]
)
# Ensure separator
if "--" not in self.launch_context.launch_args:
self.launch_context.launch_args.append("--")
self.launch_context.launch_args.extend(
[*self.launch_context.data.get("script_args", [])]
)

View file

@ -0,0 +1,61 @@
---
id: dev_blender
title: Blender integration
sidebar_label: Blender integration
toc_max_heading_level: 4
---
## Run python script at launch
In case you need to execute a python script when Blender is started (aka [`-P`](https://docs.blender.org/manual/en/latest/advanced/command_line/arguments.html#python-options)), for example to programmatically modify a blender file for conformation, you can create an OpenPype hook as follows:
```python
from openpype.hosts.blender.hooks import pre_add_run_python_script_arg
from openpype.lib import PreLaunchHook
class MyHook(PreLaunchHook):
"""Add python script to be executed before Blender launch."""
order = pre_add_run_python_script_arg.AddPythonScriptToLaunchArgs.order - 1
app_groups = [
"blender",
]
def execute(self):
self.launch_context.data.setdefault("python_scripts", []).append(
"/path/to/my_script.py"
)
```
You can write a bare python script, as you could run into the [Text Editor](https://docs.blender.org/manual/en/latest/editors/text_editor.html).
### Python script with arguments
#### Adding arguments
In case you need to pass arguments to your script, you can append them to `self.launch_context.data["script_args"]`:
```python
self.launch_context.data.setdefault("script_args", []).append(
"--my-arg",
"value",
)
```
#### Parsing arguments
You can parse arguments in your script using [argparse](https://docs.python.org/3/library/argparse.html) as follows:
```python
import argparse
parser = argparse.ArgumentParser(
description="Parsing arguments for my_script.py"
)
parser.add_argument(
"--my-arg",
nargs="?",
help="My argument",
)
args, unknown = arg_parser.parse_known_args(
sys.argv[sys.argv.index("--") + 1 :]
)
print(args.my_arg)
```

View file

@ -180,6 +180,7 @@ module.exports = {
]
},
"dev_deadline",
"dev_blender",
"dev_colorspace"
]
};