我用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);
两者都不会返回任何错误,但似乎无法正常工作。
如果我遗漏了一些显而易见的东西,我很抱歉这样的话。
编辑:我也试过系统()没有成功,我读到exec是一个更清洁的解决方案答案 0 :(得分:0)
您误解了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);
此外,确保检查错误的函数返回值,并适当地处理它们(上面未说明),但在exec-family函数的情况下,返回表示错误。
然而,在这种情况下,你应该认识到,如果你在GUI小部件的处理函数中使用它,那么你就有潜在的问题。在这种情况下,您很可能首先要fork()
,以便新进程与GUI一起运行而不是替换它,或者使用system()
来处理所有分叉,执行和等待您。另请注意,与exec函数不同,system()
通过shell运行您的命令。例如,那么:
system("cd ~/Printrun; python pronterface.py");