2011-02-17 8 views
3

QProcess 내에서 환경 스크립트를 실행 한 다음이 환경에서 다른 스크립트를 시작하려면 (QStringList로) 환경을 읽으 려합니다.QProcess의 환경 변수 검색

env 스크립트를 시작하고 환경을 읽으면 항상 빈 QStringList가 표시됩니다. QProcess 환경을 읽을 수있는 방법이 있습니까?

환경 스크립트를 처음 시작하고 동일한 QProcess 개체에서 실제 스크립트를 시작하려고했지만 어느 쪽도 도움이되지 않았습니다.

+0

시도하려는 내용에 대해 'QProcessEnvironment'를 사용하는 것처럼 들릴 수 있습니다. 일부 코드 스 니펫은 구현시 문제를 분명히 설명합니다. – AJG85

+0

일부 코드는 입니다. [code] void runScript (const QString & envScript, const QString & script) { QProcess * proc = new QProcess(); proc-> start (envScript); // "env_VAR ="env "와 같은 것을 포함하고 있습니다. env 스크립트의 환경은 여전히 ​​설정되어 있다고 생각합니다.} [/ code] – Nick

답변

3

당신은 당신이 스스로 환경을 만들고 방법의 documenation에 주어진 예에서와 같이
void QProcess::setProcessEnvironment (const QProcessEnvironment & environment) 방법을 사용하여 설정할 수 있습니다 ++ C 환경을 설정하는 스크립트를 다시 할 수있는 경우 :

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"); 

을 업데이트

위의 방법을 사용할 수 없다면 다음과 같이 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(); 
} 

이 내용이 내용 위에서이 내용으로 a.txt이 파일을 만들고 실행

echo %abc% > a.txt 

set abc=test 

및 Script.bat 파일로 env.bat를 갖는

test 
+0

감사합니다. 그러나 스크립트가 자동 생성되므로이 기능이 작동하지 않습니다. 빌드 관리 멘토 시스템을 사용하고 항상 바뀔 수 있습니다. 내가 파일을 구문 분석하고 변수를 찾을 수 있지만 그 스크립트는 "다른 경우"진술 등을 포함 할 수 있기 때문에 쉽지 않다. – Nick

+0

@ 닉 : 스크립트의 마지막 줄을 "printenv'"로 만든 다음 출력을 구문 분석한다. 스크립트 자체의 도움을 주신 덕분에 –

+0

! @Ben Voigt : 스크립트를 변경하고 싶지 않기 때문에 스크립트 자체에 대해 약간의 파서를 작성했지만 솔루션이 제대로 작동 할 수도 있습니다. @Piotr Dobrogost : 나는 그것을 시도하고 작동합니다! 고맙습니다! – Nick

1

QProcess의 setEnvironment 메소드를 사용하지 않은 경우 빈 QStringList가 예상되는 출력입니다. 이 경우, QProcess는 프로그램의 환경을 사용합니다. 이를 얻으려면

QStringList env(QProcess::systemEnvironment()); 

이 작동해야합니다.

+0

호출자 환경 (QProcess를 시작하는 qt 프로그램)을 반환합니다. 환경 스크립트를 시작한 후에 QProcess 환경이 필요합니다. – Nick

+0

@Nick : 환경 스크립트 "입니까? Q 프로세스가 쉘입니까? –

+0

다음과 같은 배치 파일입니다 : set TMP_DIR="..." set REP_ACTIVE=".." 실제 스크립트가 environmet을 설정해야하는 다른 프로세스를 시작합니다. – Nick

0

모두를 읽을 수 있습니다. 환경 변수는 QProcess에서 다음과 같은 방식으로 더 좋은 형식으로 설정됩니다 (표준 디버그 출력 창으로). 각 변수를 새 행으로 인쇄합니다.

QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); 

qDebug() << "All variables"; 

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

foreach(env_variable, paths_list) 
    qDebug() << env_variable; 
0

외부 파일을 구문 분석하지 않고도이를 수행 할 수있는 또 다른 방법입니다. 내 경우에는 내가 다른 MSVC 버전에서 vcvarsall.bat을 실행하고 (개별적으로)을 호출 한 후 전체 환경을 캡처해야 할 필요가 :

  1. 내가 환경을 수정 아무것도 호출 디스크에 cmd를 스크립트를 작성 ; cmd를 스크립트의
  2. ... 마지막 줄 내가 모든 출력을 수집 readAllStandardOutput()을 사용하여 간단하게 QProcess으로 스크립트를 실행 한 후 즉
    call ...\vc\vcvarsall.bat 
    call may\be\another.cmd 
    echo {5c131c2a-405b-478a-8279-9dff52c31537} 
    set 
    
  3. "를 설정"입니다.
  4. 출력 내용에 상관없이 앵커로 사용 된 GUID로 분할 한 후 나머지는 단순히 이전에 호출 한 전체 환경 일뿐입니다
  5. ...이제는 key = value 부분으로 줄 단위로 구문 분석하고 새로운 QProcessEnvironment (앞에서 언급했듯이)에 삽입 할 수 있으며이를 그대로 또는 새로운 수정으로 적용 할 수 있습니다.