Получить переменные окружения QProcess - PullRequest
4 голосов
/ 17 февраля 2011

Я хочу запустить скрипт среды в QProcess, а затем прочитать среду (как QStringList), чтобы запустить другие скрипты с этой средой.

Если я запускаю скрипт env и читаю среду, я всегдаполучить пустой QStringList.Есть ли способ считывания среды QProcess?

Я также попытался сначала запустить сценарий среды и запустить фактический сценарий на том же объекте QProcess, но это тоже не помогло.

Ответы [ 4 ]

4 голосов
/ 17 февраля 2011

Если вы можете переписать скрипт, который устанавливает среду на C ++, вы можете создать среду самостоятельно и установить ее, используя
пусто QProcess::setProcessEnvironment ( const QProcessEnvironment & environment ) метод, как в примере, приведенном в документации метода:

 QProcess process;
 QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
 env.insert("TMPDIR", "C:\\MyApp\\temp"); // Add an environment variable
 env.insert("PATH", env.value("Path") + ";C:\\Bin");
 process.setProcessEnvironment(env);
 process.start("myapp");

UPDATE

Если вы не можете использовать описанный выше метод, вы можете попробовать использовать cmd.exe следующим образом:

#include <QtCore/QCoreApplication>
#include <QtCore/QProcess>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    QProcess* proc = new QProcess();
    proc->start("cmd.exe /c \"call env.bat && script.bat\"");

    return app.exec();
}

Наличие env.bat с этим содержанием

set abc=test

и script.bat с этим содержимым

echo %abc% > a.txt

при выполнении вышеизложенного создает файл .txt с этим содержимым

test 
1 голос
/ 17 февраля 2011

Если вы не использовали метод setEnvironment в QProcess, тогда пустой QStringList является ожидаемым выводом.Для этого случая QProcess использует среду программы.Чтобы получить это,

QStringList env(QProcess::systemEnvironment());

должно работать.

0 голосов
/ 04 августа 2015

другой способ сделать это без разбора внешних файлов;в моем случае мне нужно выполнить vcvarsall.bat из разных версий msvc, и мне нужно захватить всю среду после их вызова (индивидуально):

  1. я записываю на диск скрипт .cmd, который вызывает все, чтоизменяет среду;
  2. ... последняя строка скрипта cmd просто "установлена", т.е.
    call ...\vc\vcvarsall.bat
    call may\be\another.cmd
    echo {5c131c2a-405b-478a-8279-9dff52c31537}
    set
    
  3. после запуска скрипта с QProcess я используюreadAllStandardOutput() для сбора всего вывода.
  4. независимо от того, что содержится в выводе, после разбиения его на guid, который использовался в качестве якоря, остальное - это просто полная среда, которую вызовы ранее создали
  5. ... теперь я могу разбирать его построчно как части ключа = значения и вставлять их в новый QProcessEnvironment (как уже упоминалось), и применять его к новым процессам как есть или с дополнительными изменениями.
0 голосов
/ 10 июля 2015

Вы можете прочитать все переменные окружения, установленные в QProcess, в более удобном формате следующим образом (в стандартное окно вывода отладки).Он будет печатать каждую переменную в новой строке.

QProcessEnvironment env = QProcessEnvironment::systemEnvironment();

qDebug() << "All variables";

QString env_variable;
QStringList paths_list = env.toStringList();

foreach( env_variable, paths_list )
    qDebug() << env_variable;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...