QProcess 내에서 환경 스크립트를 실행 한 다음이 환경에서 다른 스크립트를 시작하려면 (QStringList로) 환경을 읽으 려합니다.QProcess의 환경 변수 검색
env 스크립트를 시작하고 환경을 읽으면 항상 빈 QStringList가 표시됩니다. QProcess 환경을 읽을 수있는 방법이 있습니까?
환경 스크립트를 처음 시작하고 동일한 QProcess 개체에서 실제 스크립트를 시작하려고했지만 어느 쪽도 도움이되지 않았습니다.
QProcess 내에서 환경 스크립트를 실행 한 다음이 환경에서 다른 스크립트를 시작하려면 (QStringList로) 환경을 읽으 려합니다.QProcess의 환경 변수 검색
env 스크립트를 시작하고 환경을 읽으면 항상 빈 QStringList가 표시됩니다. QProcess 환경을 읽을 수있는 방법이 있습니까?
환경 스크립트를 처음 시작하고 동일한 QProcess 개체에서 실제 스크립트를 시작하려고했지만 어느 쪽도 도움이되지 않았습니다.
당신은 당신이 스스로 환경을 만들고 방법의 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
감사합니다. 그러나 스크립트가 자동 생성되므로이 기능이 작동하지 않습니다. 빌드 관리 멘토 시스템을 사용하고 항상 바뀔 수 있습니다. 내가 파일을 구문 분석하고 변수를 찾을 수 있지만 그 스크립트는 "다른 경우"진술 등을 포함 할 수 있기 때문에 쉽지 않다. – Nick
@ 닉 : 스크립트의 마지막 줄을 "printenv'"로 만든 다음 출력을 구문 분석한다. 스크립트 자체의 도움을 주신 덕분에 –
! @Ben Voigt : 스크립트를 변경하고 싶지 않기 때문에 스크립트 자체에 대해 약간의 파서를 작성했지만 솔루션이 제대로 작동 할 수도 있습니다. @Piotr Dobrogost : 나는 그것을 시도하고 작동합니다! 고맙습니다! – Nick
QProcess의 setEnvironment 메소드를 사용하지 않은 경우 빈 QStringList가 예상되는 출력입니다. 이 경우, QProcess는 프로그램의 환경을 사용합니다. 이를 얻으려면
QStringList env(QProcess::systemEnvironment());
이 작동해야합니다.
모두를 읽을 수 있습니다. 환경 변수는 QProcess에서 다음과 같은 방식으로 더 좋은 형식으로 설정됩니다 (표준 디버그 출력 창으로). 각 변수를 새 행으로 인쇄합니다.
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
qDebug() << "All variables";
QString env_variable;
QStringList paths_list = env.toStringList();
foreach(env_variable, paths_list)
qDebug() << env_variable;
외부 파일을 구문 분석하지 않고도이를 수행 할 수있는 또 다른 방법입니다. 내 경우에는 내가 다른 MSVC 버전에서 vcvarsall.bat을 실행하고 (개별적으로)을 호출 한 후 전체 환경을 캡처해야 할 필요가 :
readAllStandardOutput()
을 사용하여 간단하게 QProcess
으로 스크립트를 실행 한 후 즉
call ...\vc\vcvarsall.bat call may\be\another.cmd echo {5c131c2a-405b-478a-8279-9dff52c31537} set
QProcessEnvironment
(앞에서 언급했듯이)에 삽입 할 수 있으며이를 그대로 또는 새로운 수정으로 적용 할 수 있습니다.
시도하려는 내용에 대해 'QProcessEnvironment'를 사용하는 것처럼 들릴 수 있습니다. 일부 코드 스 니펫은 구현시 문제를 분명히 설명합니다. – AJG85
일부 코드는 입니다. [code] void runScript (const QString & envScript, const QString & script) { QProcess * proc = new QProcess(); proc-> start (envScript); // "env_VAR ="env "와 같은 것을 포함하고 있습니다. env 스크립트의 환경은 여전히 설정되어 있다고 생각합니다.} [/ code] – Nick