在C程序中调用Python函数

3 投票
1 回答
7611 浏览
提问于 2025-04-18 17:20

我有一个用C语言写的应用程序,后来我需要解决一个非线性优化问题。可惜的是,按照我所知道的,C语言在这方面的资源非常有限(如果你知道有什么好的资源,请告诉我)。不过在Python中,这个问题解决起来就简单多了,比如可以使用scipy.optimize.minimize这个库。

在我尝试这样做的时候,遇到了一些常见的问题,比如找不到Python.h这个文件、模块无法加载、调用函数时出现段错误等等。

那么,有什么简单快捷的方法可以让这两个程序连接起来呢?

1 个回答

11

要让这个工作顺利进行,有几个事情你需要确认一下:

  1. 确保你已经安装了Python(可能还需要安装 python-dev 这个包)。
  2. 找到你的 Python.h 文件,比如可以通过 locate Python.h 来查找。这个文件应该在 include 文件夹的某个子文件夹里,路径大概是 ../include/python2.7/Python.h 这样的。
  3. 在你的C代码中插入 #include “<path_to_Python.h>",这样你就可以使用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);
      }
      
    • 在初始化Python解释器之后,也就是在 Py_Initialize(); 之后,你需要把当前路径添加到 sys.path,这样才能加载你的模块(假设它在当前目录下):

      PyObject *sys = PyImport_ImportModule("sys");
      PyObject *path = PyObject_GetAttrString(sys, "path");
      PyList_Append(path, PyString_FromString("."));
      
  5. 记住,当你给Python文件命名时,文件名要去掉 .py 后缀。
  6. 最后,在编译和链接时,你需要做以下几件事:
    • 还记得之前用的 ../include/python2.7/Python.h 文件吗?在编译时,使用 -I 选项把 include 文件夹加入到头文件目录列表中,比如 -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程序了。

希望这些信息对你有帮助,祝你好运!

来源:

撰写回答