【问题标题】:Can't run Python file in C无法在 C 中运行 Python 文件
【发布时间】:2022-08-09 22:05:14
【问题描述】:

我在 c 中遇到了 python api 的问题。我正在尝试使用 PyRun_SimpleFile 运行 python 脚本,但它失败了

我收到此错误:d:/gcc/bin/../lib/gcc/x86_64-w64-mingw32/11.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\\Users\\aggel\\AppData\\Local\\Temp\\ccRzYgwa.o:pyboot.c:(.text+0x47): undefined reference to __imp_PyRun_SimpleFileExFlags\' collect2.exe: error: ld returned 1 exit status

编码:

define PY_SSIZE_T_CLEAN
#include <stdio.h>
#include <conio.h>
#include \"Python.h\"
#include \"fileapi.h\"
#include \"fileobject.h\"
int main(){

    PyObject* pInt;
    FILE *file = fopen( \"test.py\", \"r+\" );
    PyRun_SimpleFile(file, \"test.py\");
    return 0;
}
  • 此错误意味着您需要链接定义PyRun_SimpleFile 的库(例如-lyourlibrary)。如果您需要更多帮助,则需要指定此函数的定义位置。

标签: python c python-c-api


【解决方案1】:

对 __imp_PyRun_SimpleFileExFlags 的未定义引用

这意味着函数PyRun_SimpleFileExFlags已声明(可能在文件 Python.h 中),但未定义。该定义存在于已编译的 python 库中。库的名称可以类似于 libpython.so(用于动态库)或 libpython.a(用于静态库)。 您需要将程序与 python 库链接。 在 gcc 中,您可以使用 -l 标志。就像是

gcc -lpython3 prog.c

名称“python3”可能会有所不同,如果库名称以“lib”开头,则不需要在 -l 标志中写入 lib。 但是,如果这不起作用,您可能需要显式传递库的位置。您可以使用 -L 标志传递位置。

gcc -lpython3 -L/location/to/libpython.a prog.c

只有正确链接后,您才能使用 Python API 的功能。

【讨论】:

  • 没有。还是一样的:/
  • 如果您使用的是 linux,请转到顶级目录 (cd ~) 并运行以下命令:find . -name *python.* This应该给你一个包含 python 的文件列表。如果你看到一个 libpython.so,复制它所在的目录并用 -L 标志链接它,否则如果你看到一个静态库(libpython.a),你可以直接将它与你的程序链接。 gcc -o test test.c /path/to/libpython.a
  • 哦,我正在使用 Windows 'tho。我打算用 Linux 试试。
【解决方案2】:

这真的只是一个评论。如果我找到解决方案,我会在这里发布。

  1. 我也通过在 Windows 10 64 位版本上直接调用 PyRun_SimpleFileExFlags 得到这个。似乎无法找到包含 __imp_PyRun_SimpleFileExFlags 的库

  2. 我确实发现了各种旧的(2012 年)对涉及不存在双下划线的库的问题的引用 - 显然是由于 64 位系统的编译错误,但我认为这不太可能

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 2021-03-24
    • 2021-04-22
    • 2021-04-16
    • 2018-09-24
    • 1970-01-01
    相关资源
    最近更新 更多