从C程序中调用Python函数

Geo*_*rge 2 c c++ python python-c-api

我在C中有一个应用程序,在某些时候我需要解决非线性优化问题.不幸的是,AFAIK在C中的资源非常有限(请让我知道其他情况).但是在Python中使用它很简单,例如scipy.optimize.minimize.

当我试图这样做时,我遇到了一些看似非常频繁的陷阱,例如Python.h找不到,模块没有加载,函数调用时出现分段错误等.

什么是快速简便的第一计时器链接这两个程序的方式?

Geo*_*rge 8

为了使这项工作有一些你必须确保到位的东西:

  1. 确保安装了Python(您可能需要该python-dev软件包).
  2. 找到您的Python.h文件,例如locate Python.h.其中一个出现应该在文件夹中的子(子)文件include夹中,例如路径应该是类似的../include/python2.7/Python.h.
  3. 插入#include “<path_to_Python.h>"C代码以便能够使用Python API.
  4. 使用任何教程来调用Python函数.我用过这个,它就是诀窍.然而,有几个小点缺失:

    • 无论何时使用任何Py<Name>功能,例如PyImport_Import(),始终检查结果以确保没有错误,例如

      // Load the module object
      pModule = PyImport_Import(pName);
      
      if (!pModule)
      {
          PyErr_Print();
          printf("ERROR in pModule\n");
          exit(1);
      }
      
      Run Code Online (Sandbox Code Playgroud)
    • 在初始化Python解释器之后,即之后Py_Initialize();,您必须附加当前路径sys.path以便能够加载模块(假设它位于当前目录中):

      PyObject *sys = PyImport_ImportModule("sys");
      PyObject *path = PyObject_GetAttrString(sys, "path");
      PyList_Append(path, PyString_FromString("."));
      
      Run Code Online (Sandbox Code Playgroud)
  5. 请记住,当您提供Python文件的名称时,它必须没有扩展名.py.
  6. 最后,在编译/链接期间必须执行以下操作:
    • 还记得../include/python2.7/Python.h以前用过的文件吗?将include文件夹包含在头文件目录列表中,并在编译期间使用-I选项中的gcc选项,例如-I /System/Library/Frameworks/Python.framework/Versions/2.7/include.
    • 还将具有所需库的文件夹传递给链接器.它应该include位于文件夹所在的同一文件夹中,例如-L /System/Library/Frameworks/Python.framework/Versions/2.7/lib,与-lpython2.7选项一起(当然根据您的Python版本调整它).

现在你必须能够成功编译和执行你的C程序,并在其中调用你的Python程序.

我希望这是有益的,祝你好运!

资料来源: