Использование system()
в этом случае излишне усложняется, поскольку оно эффективно передает заданную командную строку (разветвлено) sh -c <command>
. Это означает, что вы должны обращаться с возможным процитировать аргументов и т.д. при формировании строки команды:
% sh -c 'ls asdf asdf'
ls: cannot access 'asdf': No such file or directory
ls: cannot access 'asdf': No such file or directory
% sh -c 'ls "asdf asdf"'
ls: cannot access 'asdf asdf': No such file or directory
Обратите внимание на разницу между некотируемым и цитируемых версий.
я предлагаю использовать execve()
, если выполнение команды питона является единственной целью вашей программы C, как Exec семейство функций, не возвращаются на успех. Он принимает массив константных указателей на символ в качестве нового ARGV, что делает обработку аргументов проще:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define PYTHON "/usr/bin/python3"
#define SCRIPT "script.py"
int
main(int argc, char *argv[])
{
/* Reserve enough space for "python3", "script.py", argv[1..] copies
* and a terminating NULL, 1 + 1 + (argc - 1) + 1 */
int newargvsize = argc + 2;
/* VLA could be used here as well. */
char **newargv = malloc(newargvsize * sizeof(*newargv));
char *newenv[] = { NULL };
newargv[0] = PYTHON;
newargv[1] = SCRIPT;
/* execve requires a NULL terminated argv */
newargv[newargvsize - 1] = NULL;
/* Copy over argv[1..] */
memcpy(&newargv[2], &argv[1], (argc - 1) * sizeof(*newargv));
/* execve does not return on success */
execve(PYTHON, newargv, newenv);
perror("execve");
exit(EXIT_FAILURE);
}
Как указывалось другими, вы должны использовать official APIs для этого, если это вообще возможно.