我嘗試使用QProcess
(在Windows上)從我的程序(FaceModifier.exe)中啓動blender.exe。命令遵循以下結構:具有多個參數的QProcess啓動進程(blender.exe)
'path-to-blender'--background'path-to-blend-file'--python'path-to-python-script' - 'additional-arg-換Python的腳本」
完整的例子(如果我將它輸入CMD.EXE的作品)將
「C:\ Program Files文件\ Blender基金會\攪拌機\ blender.exe 「--background」C:\ Program Files(x86)\ FaceModifier \ Resources \ GenericHeadMesh.blend「--python」C:\ Program Files(x86)\ FaceModifier \ python \ local.py「 - 」C:\ Users \貢納爾\文檔\ FaceMo difier \輸出\」現在
,我的節目裏面我逃跑的路徑,並用引號包圍他們,所以我有這樣的事情
std::string blenderPath := "\"C:\\Program Files\\Blender Foundation\\Blender\\blender.exe\""
對於QProcess中我我的所有參數送入一個QStringList中有導致/c
,所以它被視爲一個單一的命令,並將其傳遞給cmd.exe
。
我的問題是,我不能得到這個被執行。如果我手動輸入命令(我傳遞給QProcess,而不是從上面的那個)到cmd中。
我的啓動進程的功能如下:
void PythonConnector::createSubprocess(const QStringList &args)
{
QProcess *process = new Process();
process->start("cmd.exe", args);
process->waitForFinished(-1);
QString result(process->readAll());
qDebug() << "result: " << result; // this gives just an empty string
process->close();
}
我這樣稱呼它:
// for the documents path
CoInitialize(NULL);
TCHAR *myDocuments = 0;
SHGetKnownFolderPath(FOLDERID_Documents, 0, NULL, &myDocuments);
CString temp(myDocuments);
CT2CA tempConv(temp);
std::string outputFolderPath(tempConv);
outputFolderPath += "\\FaceModifier\\Output\\";
outputFolderPath = pH.ExcapeString(outputFolderPath);
CoTaskMemFree(myDocuments);
blenderPath = pH.EscapeString(blenderPath);
std::string meshGlobalPath = "\"" + pH.GetResourcesPath() + "GenericHeadMesh.blend" + "\"";
std::string pythonGlobalPath = "\"" + pH.GetPythonPath() + "global.py" + "\"";
QStringList args;
args << "/c" << QString::fromStdString(blenderPath) << "--background" << QString::fromStdString(meshGlobalPath) << "--python" << QString::fromStdString(pythonGlobalPath) << "--" << QString::fromStdString("\"" + outputFolderPath "\"");
pC.createSubprocess(args);
blenderPath
傳遞給此功能和其他功能,從註冊表中讀取。
這是我的其他輔助功能:
std::string PathHandler::GetResourcesPath()
{
if(resourcesPath.empty())
resourcesPath = GetFullPath("Resources\\");
return resourcesPath;
}
std::string PathHandler::GetPythonPath()
{
if(pythonPath.empty())
pythonPath = GetFullPath("python\\");
return pythonPath;
}
std::string PathHandler::GetFullPath(const std::string &relPath)
{
char full[_MAX_PATH];
_fullpath(full, relPath.c_str(), _MAX_PATH);
return EscapeString(std::string(full));
}
std::string PathHandler::EscapeString(const std::string &input)
{
std::regex toReplace("\\\\");
std::string output(input.begin(), input.end());
output = std::regex_replace(output, toReplace, "\\\\");
return output;
}
調試與qDebug結果在這些輸出的args列表(這些實際上是從調試在Visual Studio 2013,因此,不同的路徑):
"/c"
""C:\\Program Files\\Blender Foundation\\Blender\\blender.exe""
"--background"
""C:\\Users\\Gunnar\\documents\\visual studio 2013\\Projects\\FaceModifier\\x64\\Release\\Resources\\GenericHeadMesh.blend""
"--python"
""C:\\Users\\Gunnar\\documents\\visual studio 2013\\Projects\\FaceModifier\\x64\\Release\\python\\global.py""
"--"
""C:\\Users\\Gunnar\\Documents\\FaceModifier\\Output\\""
result
調試createSubprocess
只給出""
。
如果我鍵入此命令將在cmd手是這樣的:
CMD/C 「C:\ Program Files文件\ Blender基金會\攪拌機\ blender.exe」 --background「C:\用戶\ Gunnar \ documents \ visual studio 2013 \ Projects \ FaceModifier \ x64 \ Release \ Resources \ GenericHeadMesh.blend「--python」C:\ Users \ Gunnar \ documents \ visual studio 2013 \ Projects \ FaceModifier \ x64 \ Release \ python \ global 。PY 「 - 」C:\用戶\貢納爾\文檔\ FaceModifier \輸出\「
我得到The command "C:\\Program" is either missspelled or couldn't be found.
同樣有和沒有逃脫這樣
CMD各種不同quotings」/ C \ C:\ Program Files \ Blender Foundation \ Blender \ blender.exe \「--background \」C:\ Users \ Gunnar \ documents \ visual studio 2013 \ Projects \ FaceModifier \ x64 \ Release \ Resources \ GenericHeadMesh.blend \ 「--python \」C:\ Users \ Gunnar \ documents \ visual studio 2013 \ Projects \ FaceModifier \ x64 \ Release \ python \ global.py \「 - \」C:\ Users \ Gunnar \ Documents \ FaceModifier \ Output \\「」
只需鍵入
CMD/C 「C:\ Program Files文件\ Blender基金會\攪拌機\ blender.exe」
工作正常,但是這顯然不是我所需要的。
我無法圍繞我如何構建這個工作。有人能告訴我我的錯誤是什麼嗎?
UPDATE:
好,在理論上它現在的作品(感謝艾哈邁德),它真的depands的路徑雖然。如果我在...\Documents\FaceModifier
中有.blend和.py,它可以工作,如果它們在C:\Program Files (x86)\FaceModifier\
(我的程序已安裝),它不起作用。我怎樣才能做到這一點?我更喜歡這樣,所以我不必在那裏複製這些文件。
好吧,這一定程度上起作用。我喜歡這些文件(.blend和.py)的位置。如果他們在'Program Files(x86)...'或'documents \ visual studio \ ... \ x64 \ Release'中,我就不起作用了。我想這與權限有關,但它們只能用這個命令讀取/執行,不能寫入。有沒有辦法讓這個工作,所以我不必將它們移動到'output'文件夾? –
您是否嘗試直接運行'blender.exe'而不使用'cmd.exe'? – ahmed
哦,夥計,是的! QProcess啓動攪拌機直接知道,我刪除了'/ c',所以剩下的就是從'--background'開始的所有東西,現在它就可以工作了。非常感謝你! –