繁体   English   中英

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

[英]Invoking a python script from a makefile in another directory

我有一个makefile文件,该文件调用一个与makefile文件位于同一目录中的python脚本。 它工作正常。
在生成文件#1中:

auto:
   ./myscript.py

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

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

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

在一个建议下,我尝试将Makefile#2修改为:

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

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

我已经尝试过修改python脚本,方法是假定它位于dir#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一样在它所在的目录中运行,但是我一直在尝试使脚本正常运行,即使从其他目录调用也是如此目录。 它打开几个子流程,在每个子流程中运行一个可执行文件,并将每个子流程中的标准输出保存到文件中。 Python的subprocess.Popen传递到当前的工作目录中,默认情况下该目录是从中调用脚本的位置,而不是脚本所在的位置。 我添加了脚本,以cwd的形式将驻留目录传递给Popen调用。 但是,由于某种原因,当我在自己的目录中运行myscript.py时,它可以工作,但是当我从其他地方(从命令行)调用它时,它将挂在proc.communicate()中。 我应该解决这个python问题,但我仍然想知道为什么外部makefile无法像从其自己的目录一样调用此脚本。

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

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。 我建议您注释掉这些行,看看问题是否仍然存在。 现在有关此脚本:它是做什么的,您如何知道它在哪里运行?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM