在Cthon函数中将指针参数与python脚本中的ctype参数链接起来

时间:2016-07-20 04:24:00

标签: python c pointers ctypes

以下是显示数字除法的简单代码:

//pointer.h
#include<stdio.h>
int divide(int , int , int *);

//pointer.c
#include<stdio.h>

__declspec(dllexport) int divide(int a, int b, int *remainder)

{
    int quot = a / b;    
    remainder = a % b;
    return quot;
}

如pointer.c所示,余数是一个指针类型参数,其值将在函数本身中计算。任何人都可以告诉我如何从这个函数链接到python脚本的值如下所示:

//python script
import ctypes as C
from ctypes import *
mydll=CDLL('pointer.dll')
mydll.divide.argtypes=(C.c_int,C.c_int,C.POINTER(C.c_int))
mydll.divide.restype=C.c_int

以下是我得到的错误。

  
    
      

mydll.divide(4,32,3)       Traceback(最近一次调用最后一次):         文件“”,第1行,in           mydll.divide(4,32,3)       ctypes.ArgumentError:参数3 ::预期的LP_c_long实例而不是int

    
  

1 个答案:

答案 0 :(得分:0)

修改

看起来你用三个整数参数(mydll.divide(4,32,3))调用你的包裹除法函数。那不行。请参阅以下代码,了解您可能希望如何指定第三个参数。我的帖子的其余部分可能是不必要的,但无论如何我还是会留下任何未来读者有不同的问题。

我首先要确保你使用与python发行版相同的位数编译你的DLL(例如32位与64位)。

接下来,您的代码有一个错误,remainder = a % b;应为*remainder = a % b;(大概您是在here工作。)

最后,以下代码适用于我(在Linux下,因此使用gcc和.so文件而不是.dll文件):

<强> pointer.c

#include<stdio.h>

int divide(int a, int b, int *remainder)
{
    int quot = a / b;    
    *remainder = a % b;
    return quot;
}

<强> test.py

import ctypes as C
from ctypes import *
mydll=CDLL('pointer.so')
mydll.divide.argtypes=(C.c_int, C.c_int, C.POINTER(C.c_int))
mydll.divide.restype=C.c_int

rem = C.c_int()
res = mydll.divide(10, 3, rem)

print(res, rem.value)

运行时,这会正确打印(3, 1)

注意:

  • 使用gcc,这是使用:gcc -g -Wall -shared -fPIC -I/usr/include/python2.7/ pointer.c -o pointer.so
  • 编译的
  • 我能够删除__declspec因为gcc exports all symbols by default,如果您使用的是其他编译器,则可能需要将其保留。
  • 我没有使用.h文件