代码之家  ›  专栏  ›  技术社区  ›  PerfectlyRock

如果脚本包含dlopen(),则python 2.7api pyimport_importmodule()返回null

  •  0
  • PerfectlyRock  · 技术社区  · 8 年前

    我正在使用python c api加载一些脚本,但是,在macos x上,我注意到如果脚本包含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;
    }
    

    如果成功,两个测试都应显示“OK”,但这是实际结果:

    $ 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
    

    所以问题是,如何使用python c api中的pyimport_importmodule()导入.dylib/.so库,比如datetime?

    无论如何,这段代码在Ubuntu16.04LTS上运行良好:

    $ clang -o pytst *.c -lpython2.7 && ./pytst
    mysys: ok
    mydat: ok
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   PerfectlyRock    8 年前

    最后,我发现它只发生在Python2.7中,Python3.5+没有这样的问题。