Запуск файла с аргументами из python, встроенного в 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'

Любые советы отсюда о том, что может быть моей проблемой, очень ценятся.

РЕДАКТИРОВАТЬ: я использовал это как руководство, поскольку оно похоже на то, что я пытаюсь достичь Запустить скрипт Python с аргументами


person EthanW05    schedule 20.04.2016    source источник
comment
Ваш код даже близко не компилируется!   -  person Antti Haapala    schedule 20.04.2016
comment
Хорошо, PyFinalize -> Py_Finalize, а затем проблема, по-видимому, в вашем коде Python, поэтому вам нужно прочитать Как для создания минимального, полного и проверяемого примера   -  person Antti Haapala    schedule 20.04.2016


Ответы (1)


Ваш argc не инициализирован — вы компилировали с включенными предупреждениями и предупреждениями, превращенными в ошибки (-Wall, -Werror в GCC?); и ваш argv неправильно завершается нулем. Таким образом, ваш код имеет неопределенное поведение. Может случиться что угодно, включая демоны, вылетающие из вашего носа. Аргумент fopen mode должен быть строкой, однако вы передаете int (символьную константу), которая имеет другой UB.

Таким образом, по крайней мере, вы должны сделать:

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

Кроме того, вы не проверяете возвращаемые значения любой из этих функций. Любой из них может потерпеть неудачу, и с Python вы должны ожидать, что они потерпят неудачу, включая ваш fopen! (Пожалуйста, скажите, что они опущены для краткости).

person Antti Haapala    schedule 20.04.2016
comment
спасибо за быстрый ответ, я должен был упомянуть, что я очень новичок в python, так что теперь, когда у меня есть какое-то направление, я могу попробовать продолжить отсюда - person EthanW05; 20.04.2016
comment
Также относительно новичок в C. Это был первый вопрос, который я задал, поэтому простите меня за то, что я не был столь прямолинеен, как должен был. - person EthanW05; 20.04.2016
comment
Вы можете и должны вносить в свой вопрос незначительные правки (не меняя то, о чем вы спрашиваете, а исправляя свой вопрос), в том числе убедитесь, что code — это фактическая копия-вставка вашего кода (который даже не компилируется нигде из-за : после PyFinalize()`. - person Antti Haapala; 20.04.2016
comment
спасибо, я пропустил это, когда делал первое редактирование. я не могу скопировать код напрямую, потому что он предназначен для продукта, поэтому я переписал его, удалив конфиденциальную информацию. - person EthanW05; 20.04.2016