在Python脚本中从不同目录调用make

8 投票
3 回答
11371 浏览
提问于 2025-04-16 00:27

我需要在一个和我当前所在目录不同的地方运行 make(构建一个 makefile),而且是在一个 Python 脚本里面。如果我直接这样做:

build_ret = subprocess.Popen("../dir1/dir2/dir3/make",
                     shell = True, stdout = subprocess.PIPE)

我就会得到下面的错误信息:/bin/sh: ../dir1/dir2/dir3/make: 没有这样的文件或目录

我试过:

build_ret = subprocess.Popen("(cd ../dir1/dir2/dir3/; make)",
                     shell = True, stdout = subprocess.PIPE)

但是 make 命令被忽略了。我甚至没有收到“没有要构建的内容”的提示。

我还尝试过使用“communicate”,但也没有成功。这是在 Red Hat Linux 上运行的。

3 个回答

0

试着使用完整的路径,你可以通过调用

sys.argv[0]

来获取 Python 脚本的位置:

os.path.dirname(sys.argv[0])

os.path 模块 中,你会发现很多关于路径处理的内容。

9

使用 cwd 这个参数,并且用 Popen 的列表形式:

subprocess.Popen(["make"], stdout=subprocess.PIPE, cwd="../dir1/dir2/dir3")

通常情况下,不需要调用 shell,这样做可能会引发问题,因为会增加额外的复杂性。

11

我会选择@Philipp的方案,使用 cwd,不过顺便提一下,你也可以使用 -C 选项来执行 make 命令:

make -C ../dir1/dir2/dir3/make

-C dir, --directory=dir

在读取 makefile 或做其他事情之前,先切换到 dir 这个目录。如果指定了多个 -C 选项,每个选项都是相对于前一个选项的:比如 -C / -C etc 相当于 -C /etc。这个选项通常用于递归调用 make 命令。

撰写回答