【问题标题】:Run build for C++ code (make) in Python script在 Python 脚本中为 C++ 代码(make)运行构建
【发布时间】:2017-02-13 00:18:14
【问题描述】:

当我想使用 Python 脚本编译用 C++ 编写的代码以在 x 目录中运行“make”时,我一直遇到错误。编译代码大约需要几秒钟,所以我使用时间模块让脚本休眠 60 秒以完成代码编译。

代码如下:

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.

代码永远不会真正编译,因为其余代码取决于永远不会创建的日志文件。请指导我。

【问题讨论】:

  • 在该目录中手动运行 make 是否有效?这似乎并不表示 python 无法找到 Makefile
  • 是的。我只是能够解决它。在下面发布解决方案。

标签: python c++ shell scripting


【解决方案1】:

我实际上已经想通了,并且能够使用以下代码运行构建过程:

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()

【讨论】:

  • 这有很大的问题。您通过更改cwd 来解决一个问题,但是您将stdout 设置为管道但随后不读取它(如果它打印一堆数据,make 将死锁)然后您只需休眠任意 60 秒而不是等待打电话完成。至少,做subprocess.check_call(["make"], cwd="../../ads/main/unitest")) 并彻底摆脱睡眠。
  • 感谢@tdelaney:我阅读了文档,这很有意义。但是您的最低解决方案给了我错误: subprocess.CalledProcessError: Command '['make']' returned non-zero exit status 2.
  • 太好了!这意味着制作失败,您需要弄清楚这一点。您的原始脚本默默地忽略了错误。
  • @tdelaney 我现在明白了。但是为了在我的开发机器上进行测试,我仍然需要坚持我原来的解决方案,因为有一个错误我需要忽略并执行运行编译的二进制文件。谢谢你的建议! (此外,如果您可以删除反对票,那就太好了)因为这不适用于我正在寻找的内容。谢谢。
  • 我想你也想删除睡眠...那么它看起来不错,我会删除downvote。
猜你喜欢
  • 2013-01-02
  • 2016-03-29
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多