Python调用c/c++
来源:互联网 发布:数据分析师待遇 编辑:程序博客网 时间:2024/05/02 06:10
Python调用c/c++,其实是通过加载动态库的方式来实现的,并不是指代码的直接调用。
一、Linux下的实现方式
第一步:编写Test.c
#include <stdio.h>int pythonPrint(){printf("=====hzdeng======\n");printf("=====hzdeng======\n");printf("=====hzdeng======\n");return 0;}
编写完了之后,用gcc进行编译:gcc -o py_test.so -shared -fPIC Test.c
生成py_test.so动态库。
第二步:编写main.py
#!/usr/bin/pythonimport ctypesll = ctypes.cdll.LoadLibrarylib = ll("./py_test.so")lib.pythonPrint()
第三步:运行python main.py
第四步:运行成功。输出如下:
printf("=====hzdeng======\n");printf("=====hzdeng======\n");printf("=====hzdeng======\n");
注意,前面我们用了gcc来编译Test.c,如果用g++来编译Test.c,会是怎样呢?
先重新用g++进行编译g++ -o py_test.so -shared -fPIC Test.c
然后,运行python main.py
会出现这样的结果:
[zdh@localhost c_test]$ python main.py
Traceback (most recent call last):
File "main.py", line 9, in <module>
lib.pythonPrint()
File "/usr/lib64/python2.5/ctypes/__init__.py", line 353, in __getattr__
func = self.__getitem__(name)
File "/usr/lib64/python2.5/ctypes/__init__.py", line 358, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: ./py_test.so: undefined symbol: pythonPrint
提示说明,pythonPrint()接口没有找到。明白这个原因就要知道gcc和g++的一些基本原理了
gcc和g++都是GNU的编译器。
1、对于.c后缀的文件,gcc把它当做是C程序;g++当做是C++程序;
2、对于.cpp后缀的文件,gcc和g++都会当做c++程序;
由于我们用g++编译.c文件,这是Test.c就会被当作cpp来处理,而C++为了支持多态,对函数名进行了修饰,所以用g++编译了之后,pythonPrint不再是pythonPrint了。
因此当然提示找不到。
因此,对于.c的文件,建议用gcc进行编译,而cpp的文件,需要将函数pythonPrint做如下的修饰:
extern "C" int pythonPrint(){printf("=====hzdeng======\n");printf("=====hzdeng======\n");printf("=====hzdeng======\n");return 0;}
extern "C"就是用来强制按照C的方式进行编译的。
添加了extern "C"修饰之后,再重新生成动态库。然后就可以运行OK了。
二、Windows下的实现
待续
- BCB(C++)调用Python
- C中调用PYTHON
- C调用python
- C调用python
- Python 调用 C函数
- python调用c
- Python 调用C
- c中调用python
- Python调用c/c++
- c 调用python
- python 调用 c 函数
- python调用C函数库
- Python调用C
- Python调用C/C++
- Python调用C程序
- python调用c/c++
- python调用c
- c调用python
- Uva-825 Walking on the Safe Side 水DP
- Java反射机制剖析(四)-深度剖析动态代理原理及总结
- 黑马程序员-IOS-C语言预处理指令及杂项小计
- pull 方式解析xml文件
- 局域网下IPA更新
- Python调用c/c++
- 接口
- Java判断字符串是否包含一些字符
- Cannot assign requested address的解决办法
- 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用
- 第六周项目一
- 【IntentService】 IntentService onHandleIntent 空指针
- 史上最最佳软件开发实践指导
- linux下安装或升级GCC4.8,以支持C++11标准