使用嵌入在c中的python的参数运行文件

时间:2016-04-20 05:30:49

标签: python c python-c-api

我目前正在开发一个使用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

1 个答案:

答案 0 :(得分:1)

您的 argc未初始化 - 您是否在启用警告的情况下编译并且警告在GCC上出现错误(-Wall-Werror?);并且 argv未正确终止。因此,您的代码具有未定义的行为。可能发生任何事情,包括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! (请说明为简洁起见省略了它们。)