无法使用 exec 执行简单 Shell Script/Commonads

Can't execute simple Shell Script/Commonads with exec

我用 Qt5 设计了一个 GUI,点击一个按钮我想启动一个 python 软件。起初它尝试编写一个简单的 shell 脚本,如下所示:

#!/bin/bash
cd ~/Printrun
python pronterface.py

脚本直接在 shell 中执行时工作正常,但现在我想要一个执行脚本的 C++ 代码。我已经在这里找到了一些有用的东西,但我似乎无法让它在我的项目中工作。也许是因为我是 运行 Qt 的代码?

代码如下:

execlp("home/user/", "./my_shell_script.sh", (char *)0);

execlp("home/user/Printrun", "python pronterface.py", (char *)0);

都没有 return 任何错误,但似乎不起作用。

如果我遗漏了一些明显的东西,我很抱歉我对这样的东西很陌生。

编辑:我也试过 system() 但没有成功,我读到 exec 是一个更干净的解决方案

您误解了 execlp() 的规范。第一个参数,有时记录为 path(但对于不同的 exec 函数更常见),预计是一条通往可执行文件的路径,而不是在包含它的目录处短暂停留。然后,变量参数将所有元素指定为进程的 argv 向量,包括零 th,它通常命名正在执行的程序。因此:

execlp("home/user/my_shell_script.sh", "my_shell_script.sh", (char *)0);

但是请注意,当您提供的路径包含任何斜线字符时,execlp() 在功能上等同于 execl()

此外,您的 python 示例(至少)似乎错误地假设第一个参数给出了进程的初始 工作目录 。如果要更改工作目录,则必须手动进行。例如,

chdir("home/user/Printrun");
execlp("python", "pronterface.py", (char *)0);

此外,一定要检查函数 return 的值是否有错误,并适当地处理它们(上面没有演示),尽管在 exec-family 函数的情况下,return ing at all 表示错误。

然而,从这个角度来看,您应该认识到,如果您在 GUI 小部件的处理函数中使用它,那么您就有潜在的问题。在这种情况下,您很可能希望首先 fork(),以便新进程与 GUI 一起运行而不是替换它,或者使用 system() 代替,它处理所有分叉、执行和等待你。另请注意,与 exec 函数不同,system() 通过 shell 运行您的命令。例如,那么:

system("cd ~/Printrun; python pronterface.py");