在其他目录的Makefile中调用Python脚本

1 投票
1 回答
5880 浏览
提问于 2025-04-16 02:15

我有一个makefile,它会调用一个和makefile在同一个文件夹里的python脚本。这个运行得很好。
在makefile #1中:

auto:
   ./myscript.py

现在,我有另一个makefile,在不同的文件夹里,我想从这个新的makefile调用第一个makefile。
在makefile #2中:

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

问题是,当脚本运行时,它的运行环境就像是在makefile #2所在的文件夹里。在输出中,我看到“make[3]: Leaving directory”和makefile #1的路径,这发生在执行make之后,脚本运行之前。

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

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

但这被解释为“cd IR; AKE auto”。当我把DIR和MAKE的括号去掉时,行为和之前一样。

我还尝试修改python脚本,让它假设自己在文件夹#2里,并给它一个指向文件夹#1的路径,但行为没有改变。

这是怎么回事,我该怎么办呢?

更新
我下面的评论搞乱了代码格式,所以在这里重新写一下:

我试过这个,得到了你描述的情况。可能和目标auto调用“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在它所在的目录下运行,但我一直在尝试让这个脚本即使在不同的目录下调用时也能正常工作。它会打开几个子进程,在每个子进程中运行一个可执行文件,并把每个子进程的输出保存到文件里。Python的subprocess.Popen默认会传入当前工作目录,也就是脚本被调用的地方,而不是它所在的地方。我已经添加了代码,让脚本在Popen调用中传入它的所在目录作为cwd。不过奇怪的是,当我在自己的目录里运行myscript.py时,它能正常工作,但当我从其他地方(命令行)调用它时,它在proc.communicate()那里卡住了。我应该解决这个python的问题,但我还是想知道为什么外部的makefile不能像在自己的目录里那样调用这个脚本。

1 个回答

0

这真是太奇怪了。先说简单的部分:

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

这里的括号其实没什么用,Make会把$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。我建议你把那些行注释掉,看看问题是否还在。关于这个脚本:它是干什么的,你怎么知道它在哪里运行?

撰写回答