如何运行python脚本并在C中将参数传递给它

时间:2016-09-14 06:52:34

标签: c

我有一个python脚本script.py,它接受​​命令行参数

我想在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的经验。上面的代码来自谷歌搜索

2 个答案:

答案 0 :(得分: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(),如果执行python命令是C程序的唯一目的,因为 exec 系列函数不会成功返回。它需要一个char指针的数组作为新的 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

答案 1 :(得分:0)

您可以将命令生成为字符串。您只需要循环遍历argv [],在命令字符串的末尾附加给C程序的每个参数。然后,您可以使用命令字符串作为system()函数的参数。