当前位置: 首页 > 知识库问答 >
问题:

如何使用python调用c函数

柴茂材
2023-03-14

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

例如,在做了我的研究之后,我确实使用. dll文件找到了这个解决方案。但它找不到功能我的代码:

享乐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有趣。cpp-o乐趣。动态链接库

使用Python调用函数,ctype:

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

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

但是我有这个错误:

回溯(最后一次调用):文件“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\u ptvsd\ptvsd\ptvsd_umain_u.py”,第432行,主运行()文件“c:\Users\User。vscode\extensions\ms python。python-2019.10。41019\pythonFiles\lib\python\old\ptvsd\ptvsd\uuuuu main\uuuu。py“,第316行,在run_文件runpy.run_路径(目标,run_name='main')文件“C:\Python36\lib\runpy”中。py”,第263行,在运行路径pkg\u name=pkg\u name,脚本名称=fname)文件“C:\Python36\lib\runpy”中。py”,第96行,在代码mod_name、mod_spec、pkg_name、script_name)文件“C:\Python36\lib\runpy”中。py”,第85行,在“c:\Users\User\Desktop\ctypes\test”文件“c:\run\u code exec(code,run\u globals)中。py”,第5行,在result=mydll.add(10,1)文件“C:\Python36\lib\ctypes\uuuu init\uuu”中。py”,第361行,在getattr func=self.getitem(名称)文件“C:\Python36\lib\ctypes\uuuu init\uuuu”中。py”,第366行,在getitem func=self中。_FuncPtr((名称或顺序,self))AttributeError:找不到函数“add”

共有2个答案

董桐
2023-03-14

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

郎磊
2023-03-14

C mgles导出的名称。下面是一个应该在Windows和Linux上编译的示例。导出Windows上的函数需要__declspec(dllexport),但不需要Linux。导出函数名需要extern"C"使用C约定,而不是名称混乱的C约定。在C语言中,需要对名称进行混淆,以指示函数参数和返回类型,因为C语言可以有多个具有相同名称但采用不同参数的函数。C约定不支持多个同名函数

享乐cpp:

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

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

蟒蛇:

from ctypes import *

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

输出:

Addition value: 11
 类似资料:
  • 问题内容: 我正在尝试从C ++实现调用Python函数。我以为可以通过函数指针来实现,但是似乎不可能。我一直在使用以完成此任务。 假设在Python中定义了一个函数: 现在,我需要将此函数传递给C ,以便可以从那里调用它。如何在C 端编写代码以实现此目的? 问题答案: 如果可以使用任何名称: 将其传递给需要一个的函数。 如果它在具有相同名称的单个已知名称空间中: 已定义,因此您可以像调用任何函数

  • 我如何获得API调用以返回答案(在本例中是数字70)? 我已经看过了AWS文档和AWS API网关的步骤函数,但是我还是不清楚。 如何创建一个新的lambda函数(或使用上面两个函数中的任何一个)来调用/执行这个step函数来返回答案? 还有其他方法可以通过API调用返回步骤函数的答案吗? 附注:我想使用step函数部署我的机器学习模型,这只是我尝试的一个简单测试。

  • 问题内容: 我有很多用C语言编写的函数,我希望我用Python编写的一些代码能够访问这些函数。 我已经在这里阅读了几个类似问题的问题,但是我对我应该采用哪种方法感到困惑。 一个问题建议使用ctypes,另一个问题建议使用cython。我已经阅读了两者的文档,但对于哪个对我来说更好,我还是一无所知。 基本上,我已经编写了一些Python代码来进行二维FFT,我希望C代码能够看到该结果,然后通过编写的

  • 问题内容: 我想从JavaScript 调用,这是一个C#函数。我尝试了下面的代码,但是无论JavaScript条件是还是,都被调用了! JavaScript代码: 后面的C#代码: 如何从JavaScript调用C#函数? 问题答案: 您可以使用Web方法和Ajax:

  • 问题内容: 我需要从Java调用C#函数,为此,我创建了以下代码。我有一个创建的Java头文件Authenticator.h,代码如下: 然后,我创建了一个身份验证的C#函数 然后,我尝试使用以下代码从C ++(项目创建dll)中调用C#函数; 最后创建一个需要从Java调用的dll。该dll已创建,并且可以在Java中很好地加载它,但是在Java中却收到此错误日志。我可能会错过什么。 问题答案:

  • 问题内容: 如何从C ++应用程序调用Java函数? 我知道从CMD(或类似技术)调用它们的方法,但我宁愿不使用它们。 问题答案: 例如,检查从C创建JVM。它显示了创建JVM和调用方法的示例过程。如果JVM已经存在;例如,您的C程序被Java程序调用(回调情况),则可以缓存JNIEnv *指针。 作为建议,请小心从C / C ++缓存指向JVM的指针,其中涉及到一些有关可以缓存的内容的语义,以后