【问题标题】:Calling Python-3 function in C在 C 中调用 Python-3 函数
【发布时间】:2017-07-26 19:49:11
【问题描述】:

我正在尝试使用以下代码在 C 中调用 Python 代码:

#include <stdio.h>
#include <Python.h>

int main()
{
    PyObject* pInt;

    Py_Initialize();

    PyRun_SimpleString("print('This is Python in C')");

    Py_Finalize();

    printf("\n");
    return 0;
} 

并尝试使用以下命令对其进行编译:

gcc python_test_in_c.c 

但是它返回一个错误返回说:

undefined referance to `__imp __Py_Initialise`
undefined referance to `__imp__PyRun_SimpleSringFlags`
undefined referance to `__imp__Py_Finalise`
collect2.exe:  error: ld returned 1 exit status

出了什么问题?我该如何解决这个问题?

任何帮助将不胜感激

P.S 我不确定,但这可能与我在位于 C:/MinGW 的 MinGW 的包含文件中复制了 Python 'include' 文件(包含 Python.h)有关

更新:我现在知道这样做是可以的,但被认为是不好的做法。

【问题讨论】:

  • 你没有链接图书馆。
  • 请编辑标题!这没有任何意义,只是误导。您不会“在 C 中嵌入 Python 代码”。您只需从 Python C API 调用函数。这与任何其他图书馆没有什么不同。
  • @Olaf 从技术上讲,这在我看来就像嵌入,请参阅 PyRun_SimpleString("print('This is Python in C')");。它通过库 API 嵌入。
  • @AjayBrahmakshatriya:标题完全不同。这并不是真正的嵌入,而是简单地将字符串传递给库函数。它与例如没有什么不同。 fopen 没有人会说文件内容嵌入到 C 代码中。事实上,这个问题甚至与 Python 或可能的 C 无关,而是链接,并且用户没有提供任何信息来真正解决它(只是粗略的猜测)。
  • @Olaf python 2.7.13 文档将此称为非常高级嵌入。看到这个webpage

标签: python c python-3.x linker python-c-api


【解决方案1】:

你没有链接到 python 库...

尝试:

gcc python_test_in_c.c -lpython3.6m

将 3.6 更改为您选择的版本...

【讨论】:

  • 我已经尝试过了,但它返回一个错误,说它找不到 lpython3.6m 我的计算机上 python 的路径是 C:\Users\Simon\AppData\Local\Programs\Python\Python36-32
  • 尝试添加 -L C:\Users\Simon\AppData\Local\Programs\Python\Python36-32\libs
  • 解决了!用 gcc python_test_in_c.c -lpython36 编译它,添加了 python36 dll 和 exe,它可以工作。这 。 (dot) 和 python3.6m 中的 m 会产生错误,删除它们就可以了。感谢大家的帮助。
猜你喜欢
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 2021-02-07
  • 2018-06-14
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多