首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用execvp从C文件运行python3文件?(macOS)

无法使用execvp从C文件运行python3文件?(macOS)
EN

Stack Overflow用户
提问于 2018-12-20 10:04:53
回答 1查看 173关注 0票数 0

在下面的代码中,我试图执行一个现有的python文件( python文件很好),同时使用execvp传递一个参数。因为某种原因我不能。还值得一提的是,我正在macOSX上运行这个程序。

我从终端机上传递这样的论点:

代码语言:javascript
复制
#./run testArg

我已经试过了

代码语言:javascript
复制
   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}

最上面的一个起作用(但很明显没有争论),而最后面的两个则不行。

代码语言:javascript
复制
#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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-20 11:09:49

代码语言:javascript
复制
char** const args[] = {argv};

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

代码语言:javascript
复制
args

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

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

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

代码语言:javascript
复制
// 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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53866398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档