【问题标题】:How can I call a c++ function using python如何使用 python 调用 c++ 函数
【发布时间】:2020-02-18 16:28:14
【问题描述】:

我想知道是否有办法在 python 代码中使用 c++ 函数

例如,经过研究,我确实找到了使用 .dll 文件的解决方案。 但是找不到功能 我的代码:

fun.cpp:

#include <iostream>
extern int add(int a, int b) {
return a+b;
}
int main()
{
    std::cout << "Hello World! from C++" << std::endl;
    return 0;
}

使用 cmd 编译:

g++ fun.cpp -o fun.dll

使用Python调用函数,ctypes:

from ctypes import *
import os
mydll = cdll.LoadLibrary("C:/Users/User/Desktop/ctypes/fun.dll")

result= mydll.add(10,1)
print("Addition value:-"+result)

但我遇到了这个错误:

Traceback(最近一次调用最后一次):文件 "c:\Users\User.vscode\extensions\ms-python.python-2019.10.41019\pythonFiles\ptvsd_launcher.py", 第 43 行,在 主(ptvsdArgs)文件“c:\Users\User.vscode\extensions\ms-python.python-2019.10.41019\pythonFiles\lib\python\old_ptvsd\ptvsd__main__.py”, 第 432 行,主要 运行()文件“c:\Users\User.vscode\extensions\ms-python.python-2019.10.41019\pythonFiles\lib\python\old_ptvsd\ptvsd__main__.py”, 第 316 行,在 run_file 中 runpy.run_path(target, run_name='ma​​in') 文件“C:\Python36\lib\runpy.py”,第 263 行,在 run_path pkg_name=pkg_name, script_name=fname) 文件“C:\Python36\lib\runpy.py”,第 96 行,在 _run_module_code mod_name, mod_spec, pkg_name, script_name) 文件“C:\Python36\lib\runpy.py”,第 85 行,在 _run_code exec(code, run_globals) 文件“c:\Users\User\Desktop\ctypes\test.py”,第 5 行,在 result= mydll.add(10,1) 文件“C:\Python36\lib\ctypes__init__.py”,第 361 行,在 getattr 中 func = self.getitem(name) 文件“C:\Python36\lib\ctypes__init__.py”,第 366 行,在 getitem func = self._FuncPtr((name_or_ordinal, self)) AttributeError: function 'add' not found

【问题讨论】:

  • 这很可能是名称混淆问题,请尝试让add 使用 C 调用约定,就像第一条评论中一样
  • 也就是说:你要调用的函数应该是extern "C"
  • @MaxLanghof 我已经这样做了,但没有任何改变
  • 好吧,你展示的代码不可能工作(除非你给 ctypes 改名)。

标签: python c++ windows dll ctypes


【解决方案1】:

C++ 会破坏导出的名称。这是一个应该在 Windows 和 Linux 上编译的示例。在 Windows 上导出函数需要__declspec(dllexport),而不是在 Linux 上。 extern "C" 需要使用 C 约定导出函数名称,而不是名称损坏的 C++ 约定。 C++ 中需要名称修饰来指示函数参数和返回类型,因为 C++ 可以有多个具有相同名称但采用不同参数的函数。 C 约定不支持同名的多个函数。

fun.cpp:

#ifdef _WIN32
#   define API __declspec(dllexport)
#else
#   define API
#endif

extern "C" API int add(int a, int b) {
    return a+b;
}

Python:

from ctypes import *

dll = CDLL('fun')
result = dll.add(10,1)
print('Addition value:',result)

输出:

Addition value: 11

【讨论】:

  • 谢谢你,非常感谢你是最好的它正在工作
【解决方案2】:

我认为您应该检查 Python 的 LoadLibrary 是否正确调用了“fun.dll”的 main() 函数。加载的时候应该找DllMain()函数,然后需要获取函数地址来调用函数。

【讨论】:

  • 你能给我举个例子吗!
猜你喜欢
  • 2023-04-07
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 2012-07-26
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
相关资源
最近更新 更多