obs-scripting: Fix Python in new MacOS .app bundles

The current scripting directory path given to Python on OSX is
`../data/obs-scripting`. This works when bin/ and data/ are in the same
folder like rundir after a compile and in the old .app bundles but the
new normal .app bundle structure is different.

For bundles move obspython.py and _obspython.so to the binary folder,
just like the Lua one, and pass that bin path to the Python interpreter
so it can find it.

The current working dir isn't guaranteed to be set with .app bundles
so look up binary path at runtime.
This commit is contained in:
Rat 2019-11-17 22:11:44 +01:00
parent e3f496bf50
commit a19fef2248
3 changed files with 11 additions and 3 deletions

View File

@ -22,9 +22,9 @@ hr "Moving OBS LUA"
mv ./rundir/RelWithDebInfo/data/obs-scripting/obslua.so ./rundir/RelWithDebInfo/bin/
# Move obspython
# hr "Moving OBS Python"
# mv ./rundir/RelWithDebInfo/data/obs-scripting/_obspython.so ./rundir/RelWithDebInfo/bin/
# mv ./rundir/RelWithDebInfo/data/obs-scripting/obspython.py ./rundir/RelWithDebInfo/bin/
hr "Moving OBS Python"
mv ./rundir/RelWithDebInfo/data/obs-scripting/_obspython.so ./rundir/RelWithDebInfo/bin/
mv ./rundir/RelWithDebInfo/data/obs-scripting/obspython.py ./rundir/RelWithDebInfo/bin/
# Package everything into a nice .app
hr "Packaging .app"

View File

@ -35,6 +35,7 @@ cp ../CI/install/osx/Info.plist ./OBS.app/Contents
-x ./OBS.app/Contents/MacOS/obs \
-x ./OBS.app/Contents/MacOS/obs-ffmpeg-mux \
-x ./OBS.app/Contents/MacOS/obslua.so \
-x ./OBS.app/Contents/MacOS/_obspython.so \
-x ./OBS.app/Contents/Plugins/obs-x264.so \
-x ./OBS.app/Contents/Plugins/text-freetype2.so \
-x ./OBS.app/Contents/Plugins/obs-libfdk.so

View File

@ -1651,6 +1651,13 @@ bool obs_scripting_load_python(const char *python_path)
add_to_python_path(SCRIPT_DIR);
#if __APPLE__
char *exec_path = os_get_executable_path_ptr("");
if (exec_path)
add_to_python_path(exec_path);
bfree(exec_path);
#endif
py_obspython = PyImport_ImportModule("obspython");
bool success = !py_error();
if (!success) {