Still need answer and assistance, but will provide update on current research, in the event someone else is looking to solve the same issues.
Figured out how to call C++ code from a python script from this very helpful video. Not at all complicated as everything (may be some exceptions) exposed to Blueprints will also be exposed to Python.
PythonFunctions.h:
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "PythonFunctions.generated.h"
UCLASS()
class PYTHONPROJECT_API UPythonFunctions : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable)
static void CalledFromPython(FString InputString);
};
PythonFunctions.cpp:
#include "../Public/PythonFunctions.h"
void UPythonFunctions::CalledFromPython(FString InputString)
{
UE_LOG(LogTemp, Error, TEXT("%s"), *InputString);
}
Python script:
import unreal
unreal.PythonFunctions.called_from_python("Hello world")
Console output:
LogPython: unreal.PythonFunctions.called_from_python("Hello world")
LogTemp: Error: Hello world
(Exactly as expected)
Things to note:
Functions declared in PascalCase in C++ will be converted to snake_case within the unreal python module.
Further research:
To be able to call the build lighting commands, or the package project commands, it seems I either will need to go into the engine and expose that code to Blueprints/Python, or write some custom C++ code (Plugin perhaps) to call it for me.