簡體   English   中英

Python ctypes函數指針

[英]Python ctypes function pointer

我創建了一個包含許多函數的C庫,我可以使用ctypes從python調用它們。 我已經了解了一些更簡單的問題,但我對如何將正確的參數傳遞給以下函數感到困惑:

foo(double *, double *, void(*f1)(double *, double *, double, struct sys *),
    void(*f2)(double *, double *, double, struct sys *), struct sys *, double *,
    double, double, int, int, gsl_rng *)

我的出發點是為函數設置.argtypes POINTER(100*c_double)等排序的雙數組。

但是,我堅持如何傳遞函數指針。 我有許多函數(f1和f2的形式),它們與foo位於同一個庫中,我想將它作為參數傳遞給foo

我想我已經通過使用以下代碼傳遞了struct sys *指針ok:

class sys(Structure):
    _fields_ = [("alpha", c_double),
                ("sigma", c_double)]

然后使用POINTER(sys)作為argtype 最后, gsl_rng是GNU科學圖書館的典型隨機數生成器; 我不知道從哪里開始。

任何人都能對復雜的ctypes有所了解嗎?

像ctypes中這樣的函數指針類型似乎介於不存在和未文檔之間,但您仍然可以使用它們。 關鍵是不要定義argtypes

ctypes文檔

函數對象...默認接受任意數量的參數,接受任何ctypes數據實例作為參數,...

因此,只要我們不指定argtypes,我們就應該能夠將指針堵塞在那里並希望最好,而這種方法實際上是有效的。 這是一個簡單的工作示例:

FC:

int f(int n, int (*h)(int)){ return (*h)(n); }
int g(int n){ return n+1; }

f.py:

import ctypes
so = ctypes.CDLL('/path/to/f.so')
f = so.f
g = so.g
print(f(3, g))

輸出:

$ gcc -o f.so -shared -fPIC f.c
$ python f.py
4

當然,如果你真的想要在指定argtypes時檢查ctypes為你做的類型,那么這對你沒有幫助。 我不知道有任何方法可以吃那個特別的蛋糕並且吃它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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