使用 cython 和 cythonize 从 python 调用 C++ 函数

Calling a C++ function from python, using cython, with cythonize

我正在尝试学习 Cython,我想从 python

调用一个简单的 C++ 函数

构建时,我有一个 uio.obj : error LNK2001: unresolved external symbol _just_a_func,或者当我尝试不同的 cython 原型组合时,我的 just_a_func() 函数没有出现在我的模块中。

这是所有代码,setup.py、test.py、.pxd、.pyx 和 .h

########################
### uio.h
########################
#include <string>
using namespace std;
struct uio{
    int i;
    uio():i(2){}
    float f;
    string s;
    // float fun(int a);
    float fun(int a){return float(a+i);}

};

// int just_a_func(string s);
int just_a_func(string s){return s.length();}


########################
### uio.pxd
########################
from libcpp.string cimport string

cdef extern from "uio.h":
    cdef extern int just_a_func(string s)


########################
### uio.pyx
########################
# distutils: language = c++

from uio cimport just_a_func
cdef extern int just_a_func(s):
    return just_a_func(s)


########################
### setup.py
########################
# python .\setup.py build_ext --inplace --compiler=msvc

from setuptools import setup

from Cython.Build import cythonize

setup(ext_modules=cythonize("uio.pyx"))

########################
### test2.py
########################
import uio
print(dir(uio))
print("just_a_func", uio.just_a_func("fdsfds"))

可能是,将您的函数明确定义为 "clear C" 对您有所帮助。在任何情况下,您的错误消息都指定了该类型的函数。试试这个:

extern "C" {
  int just_a_func(string s){return s.length();}
}

https://dmtn-013.lsst.io/

上找到了解决方案

这是可行的解决方案

########################
### uio.h
########################
#include <string>
using namespace std;

int just_a_func(string s){return s.length();}


########################
### uio.pxd
########################
from libcpp.string cimport string
cdef extern from "uio.h":
    int just_a_func(string s)


########################
### uio.pyx
########################
# distutils: language = c++
# note the "as", this is a trick to avoid name clash, to allow the same function name
from uio cimport just_a_func as cjust_a_func

def just_a_func(s):
    return cjust_a_func(s)


########################
### setup.py
########################
# python .\setup.py build_ext --inplace --compiler=msvc

from setuptools import setup

from Cython.Build import cythonize

setup(ext_modules=cythonize("uio.pyx"))

########################
### test2.py
########################
import uio
from sys import argv
print(dir(uio))
print("just_a_func", uio.just_a_func((argv[1].encode())))