首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从python中调用C++函数,使用cython,使用cythonize

从python中调用C++函数,使用cython,使用cythonize
EN

Stack Overflow用户
提问于 2020-05-31 02:38:36
回答 2查看 124关注 0票数 0

我正在尝试学习Cython,我想从python中调用一个简单的C++函数

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

以下是所有代码: setup.py、test.py、.pxd、.pyx和.h

代码语言:javascript
复制
########################
### 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"))
EN

回答 2

Stack Overflow用户

发布于 2020-05-31 04:30:32

也许,将你的函数明确定义为"clear C“对你有帮助。在任何情况下,您的错误消息都会指定函数的类型。试试这个:

代码语言:javascript
复制
extern "C" {
  int just_a_func(string s){return s.length();}
}
票数 0
EN

Stack Overflow用户

发布于 2020-05-31 17:01:02

https://dmtn-013.lsst.io/上找到了解决方案

这就是可行的解决方案

代码语言:javascript
复制
########################
### 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())))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62107094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档