Python 2.7 在Ubuntu中如何将C++代码手工包装到Python中 是Python调用C++ API的代码: #include <Python.h> #include "dijsdk.h" #include <iostream> #include <QString> #include "arraysize.h" static PyObject* SDKTest_GetVersion(PyObject* self,PyObject* args); static PyMethodDef defmethod[]={ {"DijSDK_GetVersion", SDKTest_GetVersion, METH_VARARGS, "DijSDK_GetVersion() -> string. Retrieves SDK version number."}, {NULL,NULL,0,NULL} }; PyMODINIT_FUNC initSDKTest(void) { (void) Py_InitModule("SDKTest", defmethod); } static PyObject* SDKTest_GetVersion(PyObject* self,PyObject* args) { const char* name; if (!PyArg_ParseTuple(args, "s", &name)) return NULL; printf("Hello %s!\n", name); error_t result = E_OK; QString m_guids[16]; DijSDK_CamGuid guids[ARRAYSIZE(m_guids)] = {0}; unsigned int numGuids = ARRAYSIZE(guids); char version[256] = {0}; unsigned int maxLength = ARRAYSIZE(version); result = DijSDK_GetVersion(version, maxLength); std::cout<<"version = "<<version<<"\n"; result = DijSDK_Init(); //API call result = DijSDK_FindCameras(guids, &numGuids); //API call std::cout<<"\nNumguids = " <<numGuids; std::cout<<"\nResult = "<<result; Py_RETURN_NONE; } $g++ -fPIC -g -c -Wall -I/usr/include/python2.7 -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. SDKTest.cpp

Python 2.7 在Ubuntu中如何将C++代码手工包装到Python中 是Python调用C++ API的代码: #include <Python.h> #include "dijsdk.h" #include <iostream> #include <QString> #include "arraysize.h" static PyObject* SDKTest_GetVersion(PyObject* self,PyObject* args); static PyMethodDef defmethod[]={ {"DijSDK_GetVersion", SDKTest_GetVersion, METH_VARARGS, "DijSDK_GetVersion() -> string. Retrieves SDK version number."}, {NULL,NULL,0,NULL} }; PyMODINIT_FUNC initSDKTest(void) { (void) Py_InitModule("SDKTest", defmethod); } static PyObject* SDKTest_GetVersion(PyObject* self,PyObject* args) { const char* name; if (!PyArg_ParseTuple(args, "s", &name)) return NULL; printf("Hello %s!\n", name); error_t result = E_OK; QString m_guids[16]; DijSDK_CamGuid guids[ARRAYSIZE(m_guids)] = {0}; unsigned int numGuids = ARRAYSIZE(guids); char version[256] = {0}; unsigned int maxLength = ARRAYSIZE(version); result = DijSDK_GetVersion(version, maxLength); std::cout<<"version = "<<version<<"\n"; result = DijSDK_Init(); //API call result = DijSDK_FindCameras(guids, &numGuids); //API call std::cout<<"\nNumguids = " <<numGuids; std::cout<<"\nResult = "<<result; Py_RETURN_NONE; } $g++ -fPIC -g -c -Wall -I/usr/include/python2.7 -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. SDKTest.cpp,python-2.7,shared-libraries,ubuntu-14.04,Python 2.7,Shared Libraries,Ubuntu 14.04,我正在使用以下命令创建.so文件: $g++ -fPIC -g -c -Wall -I/usr/include/python2.7 -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. SDKTest.cpp $ g++ -shared -rdynamic -o SDKTest.so

我正在使用以下命令创建.so文件:

  $g++ -fPIC -g -c -Wall -I/usr/include/python2.7 -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. SDKTest.cpp
  $ g++ -shared -rdynamic -o SDKTest.so SDKTest.o -L/usr/lib/i386-linux-gnu/ -lpython2.7 -lDijSDK -lQtGui -lQtCore -Wl,-rpath=/home/embadmin/Desktop/linux/DijSDK-1.1.7-Linux/bin/
创建.so文件后,我将该文件放在:/usr/lib/python2.7/dist-packages中,并从python解释器导入此模块SDKTest

  $g++ -fPIC -g -c -Wall -I/usr/include/python2.7 -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. SDKTest.cpp
这里一切顺利,没有任何错误

  $g++ -fPIC -g -c -Wall -I/usr/include/python2.7 -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. SDKTest.cpp

我关注的是:在运行时,C++库dijSDK.so文件将加载一些库,这些库应该放在Python加载文件的位置。我将运行时库放在了文件夹中。所以文件被放在了那里,但它仍然没有被加载

  $g++ -fPIC -g -c -Wall -I/usr/include/python2.7 -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. SDKTest.cpp

我尝试了纯C++代码的相同场景,库被完美地调用,Python在这里有什么特别之处?我做错什么了吗

  $g++ -fPIC -g -c -Wall -I/usr/include/python2.7 -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. SDKTest.cpp
同样的代码在Windows中运行良好,我正在使用VisualStudio创建pyd文件

  $g++ -fPIC -g -c -Wall -I/usr/include/python2.7 -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. SDKTest.cpp

在Linux中是否需要进行任何设置才能正常工作?

可能重复的设置我也尝试过设置LD_LIBRARY_路径,但没有成功
  $g++ -fPIC -g -c -Wall -I/usr/include/python2.7 -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. SDKTest.cpp