Python 2.7 API PyImport_ImportModule () возвращает NULL, если скрипт включает dlopen () - PullRequest
0 голосов
/ 10 июня 2018

Я использую Python C API для загрузки некоторых скриптов, однако в macOS XI заметил, что если скрипт включает dylib, такой как import datetime, то произойдет сбой:

#include <stdio.h>
#ifdef __APPLE__
#include "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Python.framework/Headers/Python.h"
#else
#include "/usr/include/python2.7/Python.h"
#endif
#include <stdio.h>
#include <string.h>

void testingLoadModuleByPath(char * path, const char * name, const char * content)
{
  char fullpath[256];
  sprintf(fullpath, "%s/%s.py", path, name);
  FILE * file = fopen(fullpath, "w");
  fwrite(content, 1, strlen(content), file);
  fclose(file);
  Py_Initialize();
  PySys_SetPath(path);
  PyObject * h = PyImport_ImportModule(name);
  if (h == NULL) {
    PyErr_Print();
  } else {
    printf("%s: ok\n", name);
  }
  Py_Finalize();
}

int main(int argc, const char * argv[]) {
  testingLoadModuleByPath("/tmp", "mysys", "import sys\nclass Person:\n\thome = ''\n\tdef __init__(self):\n\t\thome = sys.path\n");
  testingLoadModuleByPath("/tmp", "mydat", "import datetime\nclass Person:\n\tbirthday = ''\n\tdef __init__(self):\n\t\tself.birthday = datetime.datetime.now().strftime(\"%A, %d. %B %Y %I:%M%p\")\n");
  return 0;
}

в случае успеха обатесты должны отображать «ОК», но это фактический результат:

$ clang -o pytst *.c -lpython2.7 && ./pytst
mysys: ok
Traceback (most recent call last):
  File "/tmp/mydat.py", line 1, in <module>
    import datetime
ImportError: No module named datetime
Program ended with exit code: 0

Так что вопрос в том, как использовать PyImport_ImportModule () для импорта библиотеки .dylib / .so, такой как datetime, в Python C API?

В любом случае, код работает на Ubuntu 16.04 LTS:

$ clang -o pytst *.c -lpython2.7 && ./pytst
mysys: ok
mydat: ok

1 Ответ

0 голосов
/ 22 июня 2018

В конце концов, я понял, что это произошло только в Python 2.7, в Python 3.5+ такой проблемы нет.

...