在Python脚本中从不同目录调用make
我需要在一个和我当前所在目录不同的地方运行 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 命令。