为什么无法将自定义 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.cpp
和BNRcallApp2.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
我已经尝试过以下建议:
sys.path.append
或 sys.path.insert
---不起作用
将 __init__.py
添加到 app2
或 app2/app2
或两者 --- 不起作用
将内容为 /Users/ABC/Desktop/app2/app2
的 .pth
添加到 /usr/local/ opt/python/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages
--- 不起作用
复制BNRapp2.py
文件到文件夹/usr/local/opt/python/Frameworks/ Python.framework/Versions/3.7/lib/python3.7/site-packages
---不起作用
将 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应用的沙箱控制。将其关闭,它会正常工作。或者需要另一种方法来解决。
我最近尝试在 cocoa 应用程序调用的 c++ 函数中嵌入自定义 python 模块,但卡在 ModuleNotFoundError
中。
我使用 xcode、app1 和 app2 创建了 2 个项目。第一个是命令行工具应用,第二个是 Cocoa 应用。同时,我分别为它们创建了 2 个 .py 文件,并得到如下所示的 2 个文件夹。
BNRcallApp1.cpp
和BNRcallApp2.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
我已经尝试过以下建议:
sys.path.append
或sys.path.insert
---不起作用将
__init__.py
添加到app2
或app2/app2
或两者 --- 不起作用将内容为
/Users/ABC/Desktop/app2/app2
的.pth
添加到/usr/local/ opt/python/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages
--- 不起作用复制
BNRapp2.py
文件到文件夹/usr/local/opt/python/Frameworks/ Python.framework/Versions/3.7/lib/python3.7/site-packages
---不起作用将
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应用的沙箱控制。将其关闭,它会正常工作。或者需要另一种方法来解决。