2016-10-04 49 views
1

當我想使用Python腳本編譯用C++編寫的代碼以在x目錄中運行「make」時,我一直遇到錯誤。編譯代碼需要幾秒鐘的時間,因此我使用時間模塊讓腳本休眠60秒以完成編譯代碼。在Python腳本中爲C++代碼(make)運行構建

下面是代碼:

from subprocess import call 
from time import sleep 
def make_ut_adsmain(): 
     os.system("make ../../ads/main/unittest") 
     # call(["ls", "-l"]) 
     sleep(60) 

make_ut_adsmain() 

# Run other functions when compiled... 

錯誤

make: *** No rule to make target `../../ads/main/unittest'. Stop. 

代碼從來沒有真正編譯因爲代碼的其餘部分取決於永遠也不會被創建日誌文件。請指導我。

+0

是否在該目錄中手動運行make?這似乎並不表示python無法找到它的Makefile文件 – vkuo

+0

。我只是能夠解決它。下面發佈解決方案。 –

回答

2

其實我想通了,並能夠通過使用下面的代碼來運行構建過程:

import subprocess 
from time import sleep 
def make_ut_adsmain(): 
     subprocess.Popen(["make"], stdout=subprocess.PIPE, cwd="../../ads/main/unitest") 
     sleep(60) 

make_ut_adsmain() 

注意,以前的解決方案,如果你需要繞過錯誤才起作用。正確的做法是以下幾點。檢查@tdelaney評論和閱讀更多關於python文檔https://docs.python.org/2/library/subprocess.html

import subprocess 
from time import sleep 
def make_ut_adsmain(): 
     subprocess.check_all(["make"], cwd="../../ads/main/unitest") 

make_ut_adsmain() 
+0

這有重大問題。你通過改變'cwd'來解決一個問題,但是你使'stdout'成爲一個管道,但是不讀取它(如果打印一堆數據,make會死鎖),然後你只需要睡60秒而不是等待通話完成。至少,執行'subprocess.check_call([「make」],cwd =「../../ ads/main/unitest」)')並完全擺脫睡眠。 – tdelaney

+0

謝謝@tdelaney:我閱讀文檔,它是有道理的。但是你的最小解決方案給我錯誤:subprocess.CalledProcessError:命令'['make']'返回非零退出狀態2. –

+1

太棒了!這意味着製造失敗,你需要弄清楚。您的原始腳本默默忽略了錯誤。 – tdelaney