我需要同时执行一些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.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()
的调用并且在那里抛出段错误,那么可能的解释是无法打开文件。
看起来您正在 *nix 系统上运行,因此缺少“/” 在
strcat(python_file_path, "src/query.py");
行中分隔 cwd
来自/src/query.py。应该是:
strcat(python_file_path, "/src/query.py");