在C程序中执行Python脚本时出现分段错误?

问题描述 投票:0回答:2

我需要同时执行一些python和C。 我尝试使用Python.h:

#include <Python.h>

int python_program(char* cwd)
{  
  char* python_file_path;
  FILE* fd;
  int run;

  python_file_path = malloc(sizeof(char) * (strlen(cwd) + strlen("src/query.py") + 1));
  strcpy(python_file_path, cwd);
  strcat(python_file_path, "src/query.py");
  fd = fopen(python_file_path, "r");

  Py_Initialize(); 


  run = PyRun_AnyFile(fd, "query.py"); //this part is where the bug occur i think

  Py_Finalize();

  free(python_file_path);
}

int main(int argc, char *argv[])
{
  char cwd_buffer[64];
  

  getcwd(cwd_buffer, sizeof(cwd_buffer));
  python_program(cwd_buffer);
  
  return 0;
}

...但是存在分段错误错误。

26057 segmentation fault (core dumped)  ../spotify-viewer-cli

我隔离了Python.h部分,这就是问题所在。那么如何在我的 C 程序中执行 python 文件呢?

python c segmentation-fault embedding
2个回答
0
投票

我尝试使用Python.h(也许它不是性能最好的解决方案)。

Python.h
是在 C 程序中嵌入 Python 解释器的一个细节,甚至不是最重要的。 “使用 Python.h”并不是描述这一点的好方法。 然而,在 C 程序中嵌入 Python 通常是运行 Python 代码的一种非常高效的方式。

您的总体方法看起来不错,但细节上存在一些问题。 如果您的代码实际上看起来像任何健壮的 C 程序必须做的那样,那么您很可能会更早且更易于管理地发现问题。 潜在问题包括:

  • main()
    cwd_buffer
    可能不够大,无法容纳当前工作目录的绝对路径。 在这种情况下,
    getcwd()
    将会失败,返回空指针并将
    errno
    设置为
    ENAMETOOLONG
    。 您可以通过验证返回值不为空来检测这一点。

  • getcwd()
    也可能因其他各种不太可能的原因而失败,您可以通过检查是否返回空指针来检测这些原因。

  • python_program()
    malloc()
    的调用可能会失败,返回空指针并适当地设置
    errno
    。 您可以通过验证返回值不为空来检测这一点。

  • 代码

      strcpy(python_file_path, cwd);
      strcat(python_file_path, "src/query.py");
    

    可能不会——并且可能不会——构建Python文件的正确路径。 如果

    cwd
    不包含尾部斜杠字符,那么几乎肯定是不正确的,而且我希望它不会。 虽然您无法直接检测到此类问题,但请参阅下一步。

  • 您不会检查打开Python文件是否成功,由于上一个问题,它可能不会成功。 如果由于该原因或任何其他可能的原因打开它失败,则

    fopen()
    将失败,返回空指针并适当设置
    errno
    。 您可以通过检查返回值是否为空来检测这一点。 如果您的程序到达对
    PyRun_AnyFile()
    的调用并且在那里抛出段错误,那么可能的解释是无法打开文件。


0
投票

看起来您正在 *nix 系统上运行,因此缺少“/” 在

strcat(python_file_path, "src/query.py");
行中分隔 cwd 来自/src/query.py。应该是:

strcat(python_file_path, "/src/query.py");
© www.soinside.com 2019 - 2024. All rights reserved.