2016-05-13 96 views
0

我嘗試使用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\(我的程序已安裝),它不起作用。我怎樣才能做到這一點?我更喜歡這樣,所以我不必在那裏複製這些文件。

回答

1

你不需要引用或雙引號的文件路徑,QProccess已經搞定, 改變這部分代碼來:

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); 
+0

好吧,這一定程度上起作用。我喜歡這些文件(.blend和.py)的位置。如果他們在'Program Files(x86)...'或'documents \ visual studio \ ... \ x64 \ Release'中,我就不起作用了。我想這與權限有關,但它們只能用這個命令讀取/執行,不能寫入。有沒有辦法讓這個工作,所以我不必將它們移動到'output'文件夾? –

+0

您是否嘗試直接運行'blender.exe'而不使用'cmd.exe'? – ahmed

+1

哦,夥計,是的! QProcess啓動攪拌機直接知道,我刪除了'/ c',所以剩下的就是從'--background'開始的所有東西,現在它就可以工作了。非常感謝你! –