使用 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();}
}
上找到了解决方案
这是可行的解决方案
########################
### 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())))
我正在尝试学习 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();}
}
这是可行的解决方案
########################
### 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())))