簡體   English   中英

Python將void指針作為參數傳遞給C函數(SWIG,Numpy)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM