使用 Ctypes 在 Python 程序中通过引用调用 c 程序
Calling call by reference c program in Python program using Ctypes
我试图在 python 程序中调用 c swap 函数。使用共享对象方法,但我坚持要传递 python 变量地址的地址。
我是 python 语言的新手,使用的 Python 版本是 2.7。
C程序:
void swap_addr(int *num1, int *num2) {
int temp = *num1;
*num1 = *num2;
*num2 * temp;
}
python 程序:
from ctypes import *
val1 = 10 ;
var2 = 20 ;
lib = cdll.LoadLibrary('./swaplib.so');
lib.swap_addr.argtypes = [c_void_p, c_void_p] ;
Addr_Var1 = POINTER(c_int);
Addr_Var2 = POINTER(c_int);
print ("Before swap val1 and var2 is " + str(var1) + " & " + str(var2))
lib.swap_addr( Addr_Var1(c_int(var1)), Addr_Var2(c_int(var2)) )
print ("After swap val1 and var2 is " + str(var1) + " & " + str(var2))
我希望输出为:
在交换 val1 和 var2 之前是 10 & 20
交换 val1 和 var2 后是 20 & 10
但实际输出如下:
在交换 val1 和 var2 之前是 10 & 20
交换 val1 和 var2 后是 10 & 20
当您调用 c_int(val1)
时,您正在创建一个新的 c_int
对象。该对象包含 C 风格的整型变量。您可以使用 byref
轻松获得指向它的指针以进行函数调用。另一方面,Python 的 int
类型是不可变的,即使您确实找到了它的地址,也不能修改;因此 val1
和 var2
不能交换。所以你的样本应该更像:
from ctypes import *
var1 = c_int(10)
var2 = c_int(20)
lib = cdll.LoadLibrary('./swaplib.so')
lib.swap_addr.argtypes = [c_void_p, c_void_p]
print ("Before swap var1 and var2 is " + str(var1.value) + " & " + str(var2.value))
lib.swap_addr( byref(var1), byref(var2) )
print ("After swap var1 and var2 is " + str(var1.value) + " & " + str(var2.value))
顺便说一句,POINTER
生成一个指针类型,它在您的 Addr_Var1
和 Addr_Var2
中完全相同。直到您在 swap_addr
的参数中创建了它们指向不同位置的类型的值,它们才立即被丢弃(很可能顺序错误)。
我试图在 python 程序中调用 c swap 函数。使用共享对象方法,但我坚持要传递 python 变量地址的地址。
我是 python 语言的新手,使用的 Python 版本是 2.7。
C程序:
void swap_addr(int *num1, int *num2) {
int temp = *num1;
*num1 = *num2;
*num2 * temp;
}
python 程序:
from ctypes import *
val1 = 10 ;
var2 = 20 ;
lib = cdll.LoadLibrary('./swaplib.so');
lib.swap_addr.argtypes = [c_void_p, c_void_p] ;
Addr_Var1 = POINTER(c_int);
Addr_Var2 = POINTER(c_int);
print ("Before swap val1 and var2 is " + str(var1) + " & " + str(var2))
lib.swap_addr( Addr_Var1(c_int(var1)), Addr_Var2(c_int(var2)) )
print ("After swap val1 and var2 is " + str(var1) + " & " + str(var2))
我希望输出为: 在交换 val1 和 var2 之前是 10 & 20 交换 val1 和 var2 后是 20 & 10
但实际输出如下: 在交换 val1 和 var2 之前是 10 & 20 交换 val1 和 var2 后是 10 & 20
当您调用 c_int(val1)
时,您正在创建一个新的 c_int
对象。该对象包含 C 风格的整型变量。您可以使用 byref
轻松获得指向它的指针以进行函数调用。另一方面,Python 的 int
类型是不可变的,即使您确实找到了它的地址,也不能修改;因此 val1
和 var2
不能交换。所以你的样本应该更像:
from ctypes import *
var1 = c_int(10)
var2 = c_int(20)
lib = cdll.LoadLibrary('./swaplib.so')
lib.swap_addr.argtypes = [c_void_p, c_void_p]
print ("Before swap var1 and var2 is " + str(var1.value) + " & " + str(var2.value))
lib.swap_addr( byref(var1), byref(var2) )
print ("After swap var1 and var2 is " + str(var1.value) + " & " + str(var2.value))
顺便说一句,POINTER
生成一个指针类型,它在您的 Addr_Var1
和 Addr_Var2
中完全相同。直到您在 swap_addr
的参数中创建了它们指向不同位置的类型的值,它们才立即被丢弃(很可能顺序错误)。