2016-09-14 3 views
0

У меня есть питон скрипт script.py который принимает командную строку ParamsКак запустить питон скрипт и передать аргументы его в C

Я хочу сделать обертку в C, так что я могу назвать script.py использованием ./script args

до сих пор у меня есть это в моем script.c файле

#include<stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]){ 
    system("python3.4 script.py"); 
    return 0; 
} 

Как изменить сценарий так, что я могу сделать ./script arg1 arg2 и код C выполняет system("python3.4 script.py arg1 arg2");

У меня нет опыта работы на C. Выше код из Google для поиска

ответ

2

Использование 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 для этого, если это вообще возможно.

0

Вы можете сгенерировать свою команду в виде строки. Вам просто нужно выполнить цикл через argv [], чтобы добавить все параметры, предоставленные программе C, в конце вашей командной строки. Затем вы можете использовать свою командную строку в качестве аргумента для функции system().

Смежные вопросы