为什么无法将自定义 python 模块嵌入到 cocoa 应用程序调用的 c++ func 中

why failed to embed custom python module in c++ func called by a cocoa app

我最近尝试在 cocoa 应用程序调用的 c++ 函数中嵌入自定义 python 模块,但卡在 ModuleNotFoundError 中。

我使用 xcode、app1 和 app2 创建了 2 个项目。第一个是命令行工具应用,第二个是 Cocoa 应用。同时,我分别为它们创建了 2 个 .py 文件,并得到如下所示的 2 个文件夹。

BNRcallApp1.cppBNRcallApp2.cpp的代码基本一样,2个.py文件完全一样,app1没问题,app2一直在喊存在 ModuleNotFoundError。

我在这里错过了什么?有什么帮助吗?非常感谢!

  ***Directory: 
          /Users/ABC/Desktop/app1
  ***app1's folder:
          ---app1
             ---BNRapp1.py
             ---BNRcallCPP.h
             ---BNRcallCPP.mm (objective-c call c++)
             ---BNRcallApp1.hpp
             ---BNRcallApp1.cpp (c++ call python module)
             ---...
          ---app1.xcodeproj

  ***Directory: 
          /Users/ABC/Desktop/app2
  ***app2's folder:
          ---app2
             ---BNRapp2.py
             ---BNRcallCPP.h
             ---BNRcallCPP.mm
             ---BNRcallApp2.hpp
             ---BNRcallApp2.cpp
             ---...
          ---app2.xcodeproj
          ---app2Tests
          ---app2UITests

我已经尝试过以下建议:

  1. sys.path.appendsys.path.insert ---不起作用

  2. __init__.py 添加到 app2app2/app2 或两者 --- 不起作用

  3. 将内容为 /Users/ABC/Desktop/app2/app2.pth 添加到 /usr/local/ opt/python/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages --- 不起作用

  4. 复制BNRapp2.py文件到文件夹/usr/local/opt/python/Frameworks/ Python.framework/Versions/3.7/lib/python3.7/site-packages ---不起作用

  5. BNRapp2.py 文件复制到文件夹 /usr/local/opt/python/Frameworks/ Python.framework/Versions/3.7/lib/python3.7/lib-dynload/usr/local/opt/ python/Frameworks/Python.framework/Versions/3.7/lib/python3.7 ---工作正常!

***BNRcallApp1.cpp:
       ...
       {
           Py_Initialize();
           if(Py_IsInitialized())
           {
               PyObject *pModule=NULL;
               PyObject *pFunc=NULL;
               PyRun_SimpleString("import sys");
               PyRun_SimpleString("sys.path.append('/Users/ABC/Desktop/app1/app1')");

               PyRun_SimpleString("print(sys.path)");
               pModule=PyImport_ImportModule("BNRapp1");
               if(pModule)
               {
                   ...
               }
               else
               {
                   ...
               }
           }
           else
           {
               ...
           }
       }
       ...
***BNRcallApp2.cpp:
       ...
       {
           Py_Initialize();
           if(Py_IsInitialized())
           {
               PyObject *pModule=NULL;
               PyObject *pFunc=NULL;
               PyRun_SimpleString("import sys");
               PyRun_SimpleString("sys.path.append('/Users/ABC/Desktop/app2/app2')");

               PyRun_SimpleString("print(sys.path)");
               pModule=PyImport_ImportModule("BNRapp2");
               if(pModule)
               {
                   ...
               }
               else
               {
                   ...
               }
           }
           else
           {
               ...
           }
       }
       ...
***BNRapp1.py & BNRapp2.py:       
       def feedback(user):
           return "hello!"
***Both the "print('sys.path')" command shows basically the same result:
['/usr/local/opt/python/Frameworks/Python.framework/Versions/3.7/lib/python37.zip', '/usr/local/opt/python/Frameworks/Python.framework/Versions/3.7/lib/python3.7', '/usr/local/opt/python/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload', '/usr/local/opt/python/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages', 
'/Users/ABC/Desktop/app1/app1'] 
['/usr/local/opt/python/Frameworks/Python.framework/Versions/3.7/lib/python37.zip', '/usr/local/opt/python/Frameworks/Python.framework/Versions/3.7/lib/python3.7', '/usr/local/opt/python/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload', '/usr/local/opt/python/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages', 
'/Users/ABC/Desktop/app2/app2'] 

我希望使用 sys.path.append 在 c++ 中导入 python 模块,但失败并出现 ModuleNotFoundError

终于发现是因为cocoa应用的沙箱控制。将其关闭,它会正常工作。或者需要另一种方法来解决。