从另一个目录中的makefile调用python脚本

时间:2010-08-03 15:40:12

标签: python makefile

我有一个makefile,它调用与makefile位于同一目录下的python脚本。它工作得很好。
在makefile#1中:

auto:
   ./myscript.py

现在,我在另一个目录中有另一个makefile,并希望从中调用第一个makefile。 在makefile#2中:

target:
    cd $(DIR); $(MAKE) auto;

问题是,当脚本运行时,它运行就好像它与makefile#2在同一目录中一样。在stdout上,我看到“make [3]:Leaving directory”和#1的路径,就在执行make之后和脚本运行之前。

根据建议,我尝试将makefile#2修改为:

target:
    ( cd $DIR; $MAKE auto; )

但这被解释为“cd IR; AKE auto”。当我更换DIR和MAKE周围的括号时,我会得到与以前相同的行为。

我已经尝试修改python脚本,让它假设它在目录#2中并给它一个#1的路径,但行为不会改变。

发生了什么,我该怎么办?

更新: 我在下面的评论搞砸了代码格式,所以就在这里:

我尝试了这个,基本上得到了你所描述的内容。它可能与目标自动调用“makefile.rules”文件这一事实有关吗?

auto: 
    @echo this is makefile \#1 making $@ in $(PWD)
    FLAG=1 $(MAKE) -f makefile.rules rulestargetA
    FLAG=2 $(MAKE) -f makefile.rules rulestargetB
    ./myscript.py

为简单起见,我省略了这个事实,但现在我想知道。

更新2 : 我不明白为什么makefile没有导致myscript.py运行,就好像它位于它所在的目录中一样,但是我一直试图让脚本在从不同的目录调用时正常运行。它打开几个子进程,在每个子进程中运行一个可执行文件,并将每个子进程的stdout保存到文件中。 Python的subprocess.Popen默认传递当前工作目录,该目录是调用脚本的位置,而不是它驻留的位置。我添加了脚本以作为cwd传递到住宅目录中的Popen调用。但是,出于某种原因,当我在自己的目录中运行myscript.py时,它可以工作,但是当我从其他地方(从命令行)调用它时,它会在proc.communicate()中挂起。我应该解决这个python问题,但我仍然想知道为什么外部makefile不能从它自己的目录中调用这个脚本。

1 个答案:

答案 0 :(得分:0)

这很奇怪。首先是简单的部分:

target:
  ( cd $DIR; $MAKE auto; )

括号在此处不执行任何操作,并将$DIR解释为$D,后跟字母“I”和字母“R”。由于未定义变量D,因此这适用于'IR'。与$MAKE相同。

现在是真正的问题。编写的makefile应该可以工作。你说它在脚本运行之前离开了目录#1 吗?我所能建议的是你首先尝试一个更简单的问题。把它放在Makefile#1中:

auto:
  @echo this is makefile \#1 making $@ in $(PWD)

然后使用Makefile#2制作target。这应该产生

make[1]: Entering directory 'path-to-one'
this is makefile #1 making auto in path-to-one
make[1]: Leaving directory 'path-to-one'

如果这就是它所说的,那么你的脚本会有些麻烦。如果它没有产生这样的结果,那么你根本无法到达Makefile#1,也许你的DIR不正确。如果它工作但是说它在目录#2中,那么我最好的猜测是你有另一个规则引用Makefile#1。试试实验并告诉我们。

修改:
好吧,这可能解释了如何在脚本运行之前离开目录#1。我建议你注释掉这些行,看看问题是否仍然存在。现在关于这个脚本:它做了什么,你怎么知道它在哪里运行?