Как использовать Cython для переноса функции, которая принимает функцию в качестве аргумента? - PullRequest
0 голосов
/ 21 января 2019

У меня есть функция C, которая принимает функцию в качестве входа.Я хотел бы иметь возможность вызвать это из Python.Конечная цель состоит в том, чтобы функция ввода была определена в python, но оценена в C. В данный момент я просто пытаюсь заставить работать игрушечный пример.Итак, вот что я сделал ...

  1. У меня есть файл заголовка, который я называю Test.h.Здесь есть одна функция, которая просто оценивает функцию с двумя аргументами.

    #include <stdio.h>
    
    double cEval( double ( *f )( double, double ), double n, double m ){
        double k1 = f( n, m );          
        return k1;
    };
    
  2. Затем я написал файл Cython, чтобы обернуть свою функцию.Этот файл называется «Test.pyx».

    cdef extern from "Test.h":
        double cEval( double ( *f )( double, double ), double n, double m )
    
    def Eval( f, n, m ):
        return cEval( f, n, m )
    
  3. Наконец, я написал файл установки.

    from distutils.core import setup, Extension
    from Cython.Build import cythonize
    
    setup(ext_modules=cythonize('Test.pyx'))
    
  4. Затем я компилирую файл «setup.py» с помощью команды «python setup.py build_ext --inplace», которая возвращает следующую ошибку:

    Compiling Test.pyx because it changed.
    [1/1] Cythonizing Test.pyx
    /usr/lib64/python2.7/site-packages/Cython/Compiler/Main.py:367: FutureWarning: Cython directive 'language_level' not set, using 2 for now (Py2). This will change in a later release! File: /maybehome/jritchie/c_interaction_example/Fun_Input/Test.pyx
      tree = Parsing.p_module(s, pxd, full_module_name)
    
    Error compiling Cython file:
    ------------------------------------------------------------
    ...
    cdef extern from "Test.h":
            double cEval( double ( *f )( double, double ), double n, double m )
    
    def Eval( f, n, m ):
            return cEval( f, n, m )              ^
    ------------------------------------------------------------
    
    Test.pyx:5:15: Cannot convert Python object to 'double (*)(double, double)'
    Traceback (most recent call last):
      File "setup.py", line 4, in <module>
        setup(ext_modules=cythonize('Test.pyx'))
      File "/usr/lib64/python2.7/site-packages/Cython/Build/Dependencies.py", line 1086, in cythonize
        cythonize_one(*args)
      File "/usr/lib64/python2.7/site-packages/Cython/Build/Dependencies.py", line 1209, in cythonize_one
        raise CompileError(None, pyx_file)
    Cython.Compiler.Errors.CompileError: Test.pyx
    

Кто-нибудь знает, что я делаю неправильно и как я могу это исправить?

...