2016-10-04 54 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