我目前正在使用C源文件的项目中进行工作,该C源文件必须与python文件进行交互(运行该文件并捕获输出),而我不确定该怎么做。目前,python文件是通过终端(linux)使用以下命令运行的:

python file arg1 arg2 arg3 arg4


我试图使用以下代码将python嵌入C代码中以首先运行文件(无输出捕获):

void python() {
    FILE * file;
    int argc;
    char * argv[5];

    argc=5;
    argv[0]="pathtofile/file";
    argv[1]="arg1";
    argv[2]="arg2";
    argv[3]="arg3";
    argv[4]="arg4";
    Py_SetProgramName(argv[0]);
    Py_Initialize();
    PySys_SetArgv(argc,argv);
    file= fopen("pathtofile/file","r");
    PyRun_SimpleFile(file,"pathtofile/file");
    PyFinalize();
}


args1-2是硬编码的,而args3-4由C代码确定(仅确定整数值),然后将其传递到python文件,然后在其中执行。

运行上面的代码时,我得到:
 TypeError:+:NoneType和'str'不支持的操作数类型

非常感谢您从这里提出的有关我的问题的任何建议。

编辑:
我一直以此为指导,因为这似乎与我试图达到的目标相似
Run a python script with arguments

最佳答案

您的argc尚未初始化-您是否在启用警告的情况下进行编译并将警告制成错误(在GCC上为-Wall-Werror?);并且您的argv不能正确以null终止。因此,您的代码具有未定义的行为。可能发生任何事情,包括demons flying out of your nosefopen mode的参数必须是字符串,但是您传递了int(字符常量)-它具有另一个UB。

因此,至少您必须执行以下操作:

int argc = 5;
char *argv[] = {
    "pathtofile/file",
    "arg1",
    "arg2",
    "arg3",
    "arg4",
    0
};
input = fopen(..., "r"); //  "r", not 'r'!


此外,您无需检查任何这些函数的返回值。它们中的任何一个都可能失败,并且使用Python时,您应该期望它们会失败-包括您的fopen! (为简洁起见,请告诉我们省略它们)。

关于python - 使用嵌入在C中的python的参数运行文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36734595/

10-11 19:42
查看更多