无法使用execvp从C文件运行python3文件? (苹果系统)

时间:2018-12-20 10:04:53

标签: python c

在下面的代码中,我试图使用execvp在传递参数的同时执行现有的python文件(该python文件很好)。由于某种原因,我无法。另外值得一提的是,我正在macOSX上运行它。

我从终端这样传递参数:

#./run testArg

我已经尝试过

   execlp("python3", "python3", "./test.py", NULL);
   execlp("python3", "python3", "./test.py", args);
   execlp("python3", "python3", "./test.py", argv);

s.t args是:        char** const args[] = {argv};

最上面的一个有效(但显然没有论据),最下面的两个无效。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <Python/Python.h>

int main(int argc, char* argv[])
{
  char** const args[] = {argv};
  execvp("./test.py", args);

1 个答案:

答案 0 :(得分:1)

char** const args[] = {argv};

创建变量,该变量是变量的数组,其类型是指向字符的指针。该数组具有 one 元素,即。它存储一个指向字符类型的指针的指针元素。这个元素具有argv指针的 value ,即。 &argv[0]的值(不是argv[0])。 args是一个变量数组,具有指向字符类型的指针。 args不是“ argv引用的所有内存的副本”。 args是一个单元素数组。

args

在大多数情况下,类型数组会衰减为类型指针。因此args衰减到指向字符的指针,即指向字符的指针。具有char ***类型。请注意,值为args == &argsargs != &argvargs数组的地址不等于argv

使用不兼容的参数调用execvp是未定义的行为,因此任何事情都可能发生。启用编译器警告并每次对其进行修复,以使程序中不会发生未定义的行为。

您想要的是在argv数组中创建指针的所有副本。您还需要一个用于NULL终止符的空间。因此,首先为argv计数字符串指针的argc数组内的所有指针的 values 分配内存。然后在argv数组内复制指针的 values 。 NULL终止数组。然后致电execvp

// allocate space
char **args = calloc(sizeof(char*), argc + 1);
// copy pointers
for (size_t i = 0; i < argc; ++i) {
    args[i] = argv[i];
}
// alternatively copy values using memcpy
memcpy(args, argv, sizeof(char*) * argc);
// null terminate
args[argc] = NULL;

execvp("./test.py", args);

// and always remember to pick up the trash
free(args);