| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- /**
- * PANDA 3D SOFTWARE
- * Copyright (c) Carnegie Mellon University. All rights reserved.
- *
- * All use of this software is subject to the terms of the revised BSD
- * license. You should have received a copy of this license along
- * with this source code in a file named "LICENSE."
- *
- * @file python_main.cxx
- * @author rdb
- * @date 2018-02-12
- */
- #include "dtoolbase.h"
- #include "config_android.h"
- #include "executionEnvironment.h"
- #undef _POSIX_C_SOURCE
- #undef _XOPEN_SOURCE
- #include <Python.h>
- #if PY_MAJOR_VERSION >= 3
- #include <wchar.h>
- #endif
- #include <dlfcn.h>
- /**
- * The main entry point for the Python activity. Called by android_main.
- */
- int main(int argc, char *argv[]) {
- if (argc <= 1) {
- return 1;
- }
- // Help out Python by telling it which encoding to use
- Py_FileSystemDefaultEncoding = "utf-8";
- Py_SetProgramName(Py_DecodeLocale("ppython", nullptr));
- // Set PYTHONHOME to the location of the .apk file.
- string apk_path = ExecutionEnvironment::get_binary_name();
- Py_SetPythonHome(Py_DecodeLocale(apk_path.c_str(), nullptr));
- // We need to make zlib available to zipimport, but I don't know how
- // we could inject our import hook before Py_Initialize, so instead
- // load it as though it were a built-in module.
- void *zlib = dlopen("libpy.zlib.so", RTLD_NOW);
- if (zlib != nullptr) {
- void *init = dlsym(zlib, "PyInit_zlib");
- if (init != nullptr) {
- PyImport_AppendInittab("zlib", (PyObject *(*)())init);
- }
- }
- Py_Initialize();
- // This is used by the import hook to locate the module libraries.
- Filename dtool_name = ExecutionEnvironment::get_dtool_name();
- string native_dir = dtool_name.get_dirname();
- PyObject *py_native_dir = PyUnicode_FromStringAndSize(native_dir.c_str(), native_dir.size());
- PySys_SetObject("_native_library_dir", py_native_dir);
- Py_DECREF(py_native_dir);
- int sts = 1;
- FILE *fp = fopen(argv[1], "r");
- if (fp != nullptr) {
- int res = PyRun_AnyFile(fp, argv[1]);
- if (res > 0) {
- sts = 0;
- } else {
- android_cat.error() << "Error running " << argv[1] << "\n";
- PyErr_Print();
- }
- } else {
- android_cat.error() << "Unable to open " << argv[1] << "\n";
- }
- Py_Finalize();
- return sts;
- }
|