【问题标题】:Can't start make command from python subprocess.Popen无法从 python subprocess.Popen 启动 make 命令
【发布时间】:2026-01-11 01:45:01
【问题描述】:

我尝试在 macOS Mojave 上通过 python 中的 make 构建项目,但得到以下输出:

如果有问题,cd到src目录并在那里运行make
cd src && /Library/Developer/CommandLineTools/usr/bin/make first
rm -f auto/config.status auto/config.cache config.log auto/config.log
rm -f auto/config.h auto/link.log auto/link.sed auto/config.mk
触摸自动/config.h
cp config.mk.dist auto/config.

进程以退出代码 0 结束

但如果我尝试从终端开始 make 一切正常。 这是我的python代码:

make_command = "make"
make_proc = subprocess.Popen(make_command, shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=args[1])

args[1] – 项目文件夹的路径,正确 ("/Users/kirill/.vim_updater")

谁能帮我解决这个问题?

【问题讨论】:

  • 您有任何错误/回溯吗?为什么你需要有shell=True 标志?
  • @milanbalazs 没有错误,过程正确结束。唯一的标准输出是关于 make 问题的消息。是的,不需要shell=True。但是这种改进并不能解决 make 的问题。我有来自 make 的相同输出
  • 你能用你的输出更新你的问题吗?也许给出解决方案会更容易。
  • @milanbalazs 我更新了问题,但这是我的全部输出

标签: python python-3.x macos makefile subprocess


【解决方案1】:

我是新手,还没有足够的声誉来发表评论。

所以请随时尝试并告诉我,以便我删除这个“答案”

使用 subprocess.call() 代替 subprocess.Popen() 您还想检查返回码。

我想你想等待结果。

为了测试,您还可以尝试使用 make 命令的绝对路径。

【讨论】:

  • 谢谢,最终解决方案:make_proc = subprocess.call([make_command], cwd=args[1])
  • 应该是returncode = subprocess.call([make_command], cwd=args[1])
【解决方案2】:

正如您在问题Process finished with exit code 0 中提到的那样。这意味着您的make 命令成功。您可以尝试以下改进的代码部分。

代码:

import subprocess
import sys

make_command = ["make"]
make_proc = subprocess.Popen(make_command, shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=sys.argv[1])
stdout, stderr = make_proc.communicate()
print("stdout: {}".format(stdout))
print("stderr: {}".format(stderr))
print("Return code: {}".format(make_proc.returncode))

输出:(如果具体文件夹中没有Makefile,可以看到返回码不为零,因为缺少Makefile(错误))

>>> python3 test.py .
stdout: b'make: *** No targets specified and no makefile found.  Stop.\n'
stderr: None
Return code: 2

如果我在我的.(根)文件夹中创建一个Makefile,其内容如下。

生成文件:

FOO = Hello World

all:
    @echo $(FOO)
    @echo $(value FOO)

输出:Makefile 存在于特定文件夹中且内容正确,因此make 成功,返回码为零(您也有基于您的问题的情况)。)

>>> python3 test.py .
stdout: b'Hello World\nHello World\n'
stderr: None
Return code: 0

【讨论】:

  • 通过subprocess.Popen 实现没有用,但我使用subprocess.Popen.call 实现了它。问题是我将论点传递给了错误的位置。谢谢你的回答
  • subprocess.Popen 没有call 属性,因此您无法使用subprocess.Popen.call。我想你的意思是subprocess.call()。另一方面,如果您对参数的位置有疑问,那么.Popen 也应该可以工作。 :)