linux平台上面python调用c

不能免俗,先打印个helloworld出来,c代码的函数

hello.c

#include <stdio.h>
int helloworld()
{
printf("hello world!");
return 0;
}

然后编译成动态链接库

 gcc hello.c -fPIC -shared -o libhello.so  

最后在python中引入ctypes这个包,然后通过一个对dlopen包装的CDLL就可以引用so中的代码

 import ctypes
so=ctypes.CDLL("./libhello.so")
so.helloworld()

python3和python都能够执行

python3 main.py
hello world!

python main.py
hello world!

python仅仅支持c代码的这种方式,如果使用c++的编译器,则会报错,例如仅仅是把文件名称替换为hello.cpp

gcc hello.cpp -fPIC -shared -o libhello.so

此时再执行

python ./main.py

则出现这种错误

Traceback (most recent call last):
File "./main.py", line 15, in <module>
so=ctypes.CDLL("./libhello.so")
File "/usr/local/lib/python2.7/ctypes/__init__.py", line 365, in __init__
self._handle = _dlopen(self._name, mode)
OSError: ./libhello.so: undefined symbol: __gxx_personality_v0

用g++更错

g++ hello.cpp -fPIC -shared -o libhello.so

则出现


Traceback (most recent call last):
File "./main.py", line 16, in <module>
so.helloworld()
File "/usr/local/lib/python2.7/ctypes/__init__.py", line 378, in __getattr__
func = self.__getitem__(name)
File "/usr/local/lib/python2.7/ctypes/__init__.py", line 383, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: ./libhello.so: undefined symbol: helloworld

linux平台上面python调用c

时间: 2024-10-21 14:55:11

linux平台上面python调用c的相关文章

举例讲解Linux系统下Python调用系统Shell的方法

有时候难免需要直接调用Shell命令来完成一些比较简单的操作,比如mount一个文件系统之类的.那么我们使用Python如何调用Linux的Shell命令?下面来介绍几种常用的方法:1. os 模块 1.1. os模块的exec方法族Python的exec系统方法同Unix的exec系统调用是一致的.这些方法适用于在子进程中调用外部程序的情况,因为外部程序会替换当前进程的代码,不会返回.( 这个看了点 help(os)  --> search "exec" 的相关介绍,但是没太搞

python调用C函数

是的,我又开始integrate另一个方法~~ 此方法用C++,Python作胶水,供Matlab调用,原来是在Linux上编译运行,我需要把它在Windows x64上跑起来~~ 在Linux平台,Python调用C是通过这样的方式来进行的: var = CDLL('test.so') 其中,.so是Linux上的一种称为共享库的文件,类似于Windows的.dll文件.那么想当然的,在Windows下面要想调用,我们需要把后面的这个文件替换成test.dll. 这个步骤也不难,方法就是在需要

[Python 学习] 二、在Linux平台上使用Python

这一节,主要介绍在Linux平台上如何使用Python 1. Python安装. 现在大部分的发行版本都是自带Python的,所以可以不用安装.如果要安装的话,可以使用对应的系统安装指令. Fedora系统:先以root登入,运行 yum install python Ubuntu系统:在root组的用户, 运行 sudo apt-get install python 2. 使用的Python的脚本 Linux是一个以文件为单位的系统,那么我们使用的Python是哪一个文件呢? 这个可以通过指令

linux下python调用c模块

在C调用Python模块时需要初始化Python解释器,导入模块等,但Python调用C模块却比较简单,下面还是以helloWorld.c 和 main.py 做一说明:   (1)编写C代码,hello.c代码很简单,只是输出“Hello World!”:         (2)将编写的C代码编译成动态链接库的形式,具体命令:   此时在当前目录下就生成了libhello.so 的动态链接库:         (3)在main.py中导入动态链接库,并调用C函数 这里的ctypes是Pytho

PylinuxQQ 实现linux平台使用qq

pylinuxqq是博主在linux平台下面使用webqq或者其他第三方插件,或者wine模拟,都或多或少的有一些缺陷.而且一直想锻炼一下,自己写一个linux平台下面的QQ.pylinuxqq基于python,目前博主还算小菜,正在开发当中.下面就记录下开发中遇到的一些问题: 项目地址:https://github.com/younfor/PyLinuxQQ 有兴趣的可以fork一份来一起开发 如何连接QQ 结合网上的方法,发现webqq最新版smartqq是相对比较容易的一种方法.通过pyt

51CTO下载-python调用java.docx

链接: http://blog.csdn.net/jobjava/article/details/7280798 python调用Java: JPype使用介绍 Python 作为一种灵活的软件开发语言在当今被广泛使用.在软件开发过程中,有时需要在 Python 项目中利用既有的 Java 代码,已达到节省时间和开发成本的目的.因此,找到一个 Python 代码调用 Java 代码的桥梁是非常有意义的. JPype 就是这样的一个工具,利用它可以使 Python 程序方便的调用 Java 代码,

测试:python调用cmd命令三种方法

目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码,高位为脚本的退出状态码,即脚本中"exit 1"的代码执行后,os.system函数返回值的高位数则是1,如果低位数是0的情况下,则函数的返回值是0×100,换算为10进制得到256. 如果我们需要获得os.system的正确返回值,那使用位移运算可以还原返回值: >>>

[Python] Python 调用 C 共享库

Linux/Unix 平台下共享库(Shared Library)文件后缀 .so:在 Windows 平台称为动态链接库(Dynamic Link Library),文件名后缀为 .dll. 利用 ctypes 模块调用 C 共享库 ctypes 是 Python 标准库提供的一个模块,Python 2.3 版本以上支持该模块.ctypes 是 Python 高级外部函数接口,Python 通过它可以调用 C 语言编译的静态链接库和动态链接库.ctypes 支持多个平台,包括 Windows,

python调用C语言接口

python调用C语言接口 注:本文所有示例介绍基于linux平台 *** 在底层开发中,一般是使用C或者C++,但是有时候为了开发效率或者在写测试脚本的时候,会经常使用到python,所以这就涉及到一个问题,用C/C++写的底层库,怎么样直接被python来调用? python作为一门胶水语言,当然有办法来处理这个问题,python提供的方案就是ctypes库. ctypes ctypes是python的外部函数库,它提供了C语言的兼容类型,而且可以直接调用用C语言封装的动态库. 如果各位有较