我需要在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上运行的。
答案 0 :(得分:9)
我会使用@ Philipp的使用cwd
的解决方案,但作为旁注,您还可以使用-C
选项进行制作:
make -C ../dir1/dir2/dir3/make
在阅读makefile或执行其他操作之前,请转到目录 dir 。如果指定了多个-C选项,则每个选项都相对于前一个选项进行解释:
-C / -C etc
等同于-C /etc
。这通常与make的递归调用一起使用。
答案 1 :(得分:5)
使用cwd
参数,并使用Popen
的列表形式:
subprocess.Popen(["make"], stdout=subprocess.PIPE, cwd="../dir1/dir2/dir3")
几乎从不需要调用shell,并且由于涉及额外的复杂性,可能会引起问题。
答案 2 :(得分:0)
尝试使用完整路径,您可以通过调用
获取python脚本的位置sys.argv[0]
获取路径:
os.path.dirname(sys.argv[0])
中找到很多路径操作