使用python脚本从不同的目录调用make

使用python脚本从不同的目录调用make,python,linux,Python,Linux,我需要从Python脚本中调用与我所在目录不同的make(构建makefile)。如果我只是这样做: build_ret = subprocess.Popen("../dir1/dir2/dir3/make", shell = True, stdout = subprocess.PIPE) 我得到以下信息: /bin/sh:../dir1/dir2/dir3/make:没有这样的文件或目录 我试过: build_ret = subprocess.Pop

我需要从Python脚本中调用与我所在目录不同的make(构建makefile)。如果我只是这样做:

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命令被忽略。我甚至没有收到“无需构建”的消息


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

尝试使用完整路径,您可以通过调用

sys.argv[0]
要获取路径,请执行以下操作:

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

您将在

中找到相当多的路径操作。请使用
cwd
参数,并使用
Popen
的列表形式:

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

调用shell几乎从来都不是必需的,而且由于涉及到额外的复杂性,很可能会导致问题。

我同意@Philipp使用
cwd
的解决方案,但作为一个补充说明,您也可以使用
-C
选项:

make -C ../dir1/dir2/dir3/make
-C dir,--directory=dir 在读取makefile或执行任何其他操作之前,请更改为directory。如果指定了多个-C选项,则每个选项都相对于前一个选项进行解释:
-C/-C etc
相当于
-C/etc
。这通常用于make的递归调用


python文档说明如下:如果cwd不是None,则在执行之前,子目录的当前目录将更改为cwd。请注意,搜索可执行文件时不考虑此目录,因此不能指定程序相对于cwd的路径。所以我不确定这是否有效。当然,
make
程序应该在搜索路径中。我很确定这是可行的(除非我犯了一些愚蠢的错误),因为我一直在使用它。当然,在这种情况下,这是正确的。我有点困惑。只使用
os.path.dirname
时要小心。当只给出一个文件名时,它返回一个空字符串。调用
os.path.abspath(os.path.dirname(sys.argv[0]))
将始终获得完整路径。