为 startDetached() QProcess 设置环境变量

Posted

技术标签:

【中文标题】为 startDetached() QProcess 设置环境变量【英文标题】:Set Environment Variables for startDetached() QProcess 【发布时间】:2010-11-24 10:51:29 【问题描述】:

在 Qt4 中,有 QProcess::setProcessEnvironment() 用于为新生成的进程设置 Env 变量。

但是,QProcess::startDetached() 是静态成员函数,因此 setProcessEnvironment() 不适用。 Qt中如何为分离的进程设置Env变量?

【问题讨论】:

【参考方案1】:

这是一个已知的老错误:http://bugreports.qt-project.org/browse/QTBUG-2284。你需要重载startDetached 函数来支持你自己的环境。查看 Qt 源代码以了解如何做到这一点:http://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/io?h=5.5(qprocess* 文件)。

【讨论】:

重写 startDetached() 应该可以解决问题,明天试试。惊讶地发现这个错误持续了多长时间。不得不在用户代码中调用 putenv() 是丑陋的。这应该在 Qt 中完成。 显然这个错误还没有被修复。我正在使用 Qt 4.8.4 并且遇到了同样的问题。尝试从我的 Qt 应用程序启动外部控制台应用程序并希望看到控制台窗口,但我还需要为该进程设置各种环境设置,并且在分离启动时不起作用。【参考方案2】:

此行为已在 Qt 5.10.0 中修复。但是,调用的顺序似乎很重要。以下示例有效

QProcess proc;
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
env.insert("var-name", "var-value");
proc.setProgram("program-path");
proc.setProcessEnvironment(env);
proc.startDetached();

虽然这样做不起作用

QProcess proc;
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
env.insert("var-name", "var-value");
proc.setProcessEnvironment(env);
proc.startDetached("program-path");

【讨论】:

【参考方案3】:

现在使用Qt5.5,遇到这个问题。

在Win7下,使用下面的代码,在父进程中设置环境,子进程似乎继承了环境。不确定,但它在我的情况下有效。

希望有更好的解决方案

QString oldPath = qgetenv( "Path" );
QByteArray newPath = ( QCoreApplication::applicationDirPath() + ";" + oldPath ).toLocal8Bit();
bool bSet = qputenv("Path", newPath);
if ( !bSet )

    qDebug()<<"Failed";

【讨论】:

以上是关于为 startDetached() QProcess 设置环境变量的主要内容,如果未能解决你的问题,请参考以下文章

QProcess::startDetached shell 在父进程死亡时被杀死,如果父进程是一个 systemd 服务

PyQt4 QProcess.startDetached() - 无法获得衍生进程的返回值和 PID

QProcess::startDetached(5.10有了一种新的方式)

Qt QProcess startDetached 无法结束进程(bash 会话)

即使进程终止,waitpid 总是返回 -1

如何在给定 PID 的情况下隐藏进程的控制台?