[英]Python passing void pointer as parameter to C function (SWIG, Numpy)
我需要將指針從Python傳遞到C函數。 我目前正在嘗試使用SWIG,但我准備切換到任何可以解決我的問題的方法:)
為了簡化我的問題,我在SWIG中編寫了這個空的C函數:
extern void myvoidp(void *p);
我已經設置了.i和.c文件,都可以正常編譯並且可以在Python中工作。
我想傳遞一個Numpy數組。 我可以這樣獲取Numpy數據的內存地址
>>> anp = array([1,2,3])
array([1, 2, 3])
>>> anp.ctypes.data
40546992
我可以使用ctypes和numpy將其強制轉換為void *:
>>> anp.ctypes.data_as(ctypes.c_void_p)
c_void_p(40546992)
我嘗試了無盡的變體。 無論我做什么,當我調用C函數時都會收到此錯誤。
>>> myswig.myvoidp(anp.ctypes.data_as(ctypes.c_void_p))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: in method 'myvoidp', argument 1 of type 'void *'
我不知道如何編寫一個Python / numpy語句,該語句允許我(簡單地)將指針傳遞給C函數。 :-(
我猜想您想接收一個指向NumPy數組數據的指針,以便可以從C訪問該數組元素。NumPy附帶了SWIG支持 ,使用簡單方便。 只需下載numpy.i
並將其放置在您的項目目錄中即可。
只需將C函數的簽名從(void *p)
更改為(double *data, int length)
並應用NumPy類型圖。
test.i
%module example
%{
#define SWIG_FILE_WITH_INIT
#include <stdio.h>
void myvoidp(double *data, int length) {
printf("data = [ ");
for (int i = 0; i < length; ++i) {
printf("%f ", data[i]);
}
printf("]\n");
}
%}
%include "numpy.i"
%init %{
import_array();
%}
%apply (double* IN_ARRAY1, int DIM1) {(double *data, int length)}
void myvoidp(double *data, int length);
test.py
from example import myvoidp
from numpy import array
anp = array([1,2,3])
myvoidp(anp)
調用示例:
$ swig -python test.i
$ clang -Wall -Wextra -Wpedantic -I /usr/include/python3.6m/ -fPIC -shared -o _example.so test_wrap.c -lpython3.6m
$ python3 test.py
data = [ 1.000000 2.000000 3.000000 ]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.