2013-04-18 19 views
4

我正在構建一個應該能夠在機器之間自由移動的項目。爲了沒有數百MB的庫,我正在編寫一系列下載和構建依賴以及我自己的項目的python腳本。我正在使用CMake來生成VS項目。從python腳本中調用CMake導致「無法創建具名的發生器」

要調用CMake的我建立一個命令行,我使用Python subprocess.check_call如下

cmakeCmd = ["cmake.exe", '-G "Visual Studio 11 Win64"', build_path] 
retCode = subprocess.check_call(cmakeCmd, stderr=subprocess.STDOUT, shell=True) 

的問題是,如果我使用-G選項從CMake的我碰到下面的錯誤,無論發電機的我選擇:

CMake Error: Could not create named generator "Visual Studio 11 Win64" 

我在想,應該是一些環境變量缺失,但Python路徑是完整的所有我的系統的變量。

奇怪的是,如果我不設置生成器並讓CMake選擇默認的腳本,腳本運行良好。我沒有理由爲什麼。

回答

10

您需要將-G標誌與其命令中的值分開。蟒蛇似乎有效地調用

cmake "-G Visual Studio 11 Win64" <build_path> 

你想更重要的是這樣的:

cmakeCmd = ["cmake.exe", "-G", "Visual Studio 11 Win64", build_path] 
+0

問題是我在生成器名稱中使用雙引號,因爲這是我在命令行中執行的操作。 Python已經用引號包裝了參數。謝謝。 – McLeary

0

應該是:

cmakeCmd = ['cmake', '-G', 'Visual Studio 11 Win64', build_path] 

對於跨platformness起見,我建議請執行以下操作:

if sys.platform.startswith('win'): 
    shell = True 
else: 
    shell = False 

retCode = subprocess.check_call(cmakeCmd, stderr=subprocess.STDOUT, shell=shell) 

如果您計劃在多個平臺(包括Unix OS系列)上使用該項目。順便說一句,因爲您在Windows上使用shell=True,所以您可以在cmakeCmd中省略.exe後綴(如果此腳本在Unix操作系統系統上使用,則不會存在.exe這種情況)。

+0

爲什麼在Unix中禁用shell? – McLeary

+0

因爲那樣它根本就不起作用。 ':)'這與CMake無關,特別是從Python中調用任何外部命令。 –

+1

我在linux機器上做了一個快速測試,我看到的是,使用shell作爲列表的命令不起作用。如果列表中包含整個命令行的一個元素,則它可以正常工作。天哪,爲什麼! – McLeary

相關問題