我试图在C程序中嵌入一个python程序。 我的操作系统是Ubuntu 14.04
我尝试在相同的C代码库(作为单独的应用程序)中嵌入python 2.7和python 3.4解释器。 编译和链接在嵌入python 2.7时有效,但不适用于python 3.4。 它在链接器阶段失败。
这是我的C代码(只是一个例子不是真正的代码)
simple.c
#include #include int main(int argc, char *argv[]) { PyObject *pName, *pModule, *pFunc, *pValue; char module[] = "get_version"; char func[] = "get_version"; char module_path[] = "."; Py_Initialize(); PyObject *sys_path = PySys_GetObject("path"); PyList_Append(sys_path, PyUnicode_FromString(module_path)); pName = PyUnicode_FromString(module); pModule = PyImport_Import(pName); Py_DECREF(pName); if(pModule != NULL) { pFunc = PyObject_GetAttrString(pModule, func); if (pFunc && PyCallable_Check(pFunc)) { pValue = PyObject_CallObject(pFunc, NULL); if (pValue != NULL) { printf("Python version: %sn", PyString_AsString(pValue)); Py_DECREF(pValue); } else { Py_DECREF(pFunc); Py_DECREF(pModule); PyErr_Print(); fprintf(stderr,"Call failedn"); return 1; } } } Py_Finalize(); return 0; }
get_version.py
import sys def get_version(): version = '.'.join(str(v) for v in sys.version_info[:3]) print("version: ", version) return version
我用gcc编译程序。 首先将编译和链接标志设置为python 2.7我使用以下命令运行编译和链接:
gcc `python-config --cflags` simple.c `python-config --ldflags`
标志扩展为:
python-config –cflags: -I/usr/include/python2.7 -I/usr/include/x86_64-linux-gnu/python2.7 -fno-strict-aliasing -D_FORTIFY_SOURCE=2 -g -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes
python-config –ldflags: -L/usr/lib/python2.7/config-x86_64-linux-gnu -L/usr/lib -lpthread -ldl -lutil -lm -lpython2.7 -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions
它没有任何问题,工作正常。 当我尝试用python3.4标志编译它时,它失败了:
gcc `python3-config --cflags` simple.c `python3-config --ldflags`
标志扩展为:
python-config –cflags: -I/usr/include/python3.4m -I/usr/include/python3.4m -Wno-unused-result -g -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes
python-config –ldflags: -L/usr/lib/python3.4/config-3.4m-x86_64-linux-gnu -L/usr/lib -lpython3.4m -lpthread -ldl -lutil -lm -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions
错误信息:
simple.c: In function 'main': simple.c:27:17: warning: implicit declaration of function 'PyString_AsString' [-Wimplicit-function-declaration] printf("Python version: %sn", PyString_AsString(pValue)); ^ simple.c:27:17: warning: format '%s' expects argument of type 'char *', but argument 2 has type 'int' [-Wformat=] /tmp/ccaoMdTo.o: In function `main': /home/vagrant/c_python_api/simple.c:27: undefined reference to `PyString_AsString' collect2: error: ld returned 1 exit status
我尝试通过更改指定链接器对象的顺序。 但没有运气。 知道为什么会这样吗?
谢谢您的帮助!!
Python 3不再有PyString_AsString
; Python 3 str
对应Python 2 unicode
对象; 在Python 3中处理str
的函数的名称是在C-API中的PyUnicode_
-prefixed。
这样一行:
printf("Python version: %sn", PyString_AsString(pValue));
可以更改为在Python 3上使用PyUnicode_AsUTF8
:
#if PY_MAJOR_VERSION >= 3 printf("Python version: %sn", PyUnicode_AsUTF8(pValue)); #else printf("Python version: %sn", PyString_AsString(pValue)); #endif
(不是将NULL
传递给printf
%s
会有未定义的行为,所以你要检查是否返回了非NULL指针)
以上就是c/c++开发分享在C中嵌入Python:链接时出错 – 对PyString_AsString的未定义引用相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/560260.html