Python创建依赖项的makefile

Python创建依赖项的makefile,python,makefile,Python,Makefile,我有一个基于Makefile的项目和一些创建绘图文件的python脚本,例如(在我的Makefile中) 通常这些脚本依赖于数据,例如my_data.txt,因此我将其添加到我的Makefile中 plot.pdf: my_script.py python my_script.py -o $@ plot.pdf: my_script.py my_data.txt python my_script.py -o $@ 这非常麻烦,因为我需要保持Makefile和python脚本同

我有一个基于Makefile的项目和一些创建绘图文件的python脚本,例如(在我的Makefile中)

通常这些脚本依赖于数据,例如
my_data.txt
,因此我将其添加到我的Makefile中

plot.pdf: my_script.py
    python my_script.py -o $@
plot.pdf: my_script.py my_data.txt
    python my_script.py -o $@
这非常麻烦,因为我需要保持Makefile和python脚本同步。因此,我转而从python脚本导出Make规则:

plot.pdf: my_script.py
    python my_script.py -o $@ --make-mode
--make mode
将编写一个Makefile,说明
plot.pdf
my_data.txt
的依赖关系。我的Makefile设置为源所有这些自动生成的Makefile


为了在更改python脚本时支持增量构建,我在
my_script.py
上声明了
plot.pdf
的依赖关系。但是
my_script.py
还依赖于我编写的其他python脚本。如果我更改这些脚本,例如
utils.py
,我的文件
plot.pdf
将不会更新是否有一种方法可以从python中获取导入的python脚本的文件路径,以便我可以将它们添加到自动生成的Makefile中?或者您可以推荐一种替代方法?

每个导入的python脚本都可以作为一个模块使用。此模块公开包含脚本文件名的
\uuuuuuuuuuuuuuuu
属性:

import my_other_script
print(my_other_script.__file__)

一种方法可以做到这一点,例如,如果我想知道操作系统模块的位置

import os
path = os.path.abspath(os.__file__)
print (path)

path = os.path.dirname(os.__file__)
print (path)
结果

PS D:\Coding\pytest> python run.py
C:\Users\hassan\AppData\Local\Programs\Python\Python37-32\lib\os.py
C:\Users\hassan\AppData\Local\Programs\Python\Python37-32\lib
PS D:\Coding\pytest>

最后我找到了一个令我高兴的答案:

import sys
print('\n'.join(
     [modu.__file__ for modu in sys.modules.values() 
          if '__file__' in dir(modu) 
          and modu.__file__ is not None]
))

它既包含系统python脚本也包含我的用户脚本。

您可能也对该工具感兴趣。它是一个类似于Python的可编程系统。PydoIT确实很有意思,我会为下一个项目考虑它。谢谢,它已经解决了我需要的一半。是否有方法对所有导入的用户脚本执行此操作?我的意思是没有明确列出,我不明白。导入用户脚本时,必须使用
import
语句显式列出它,对吗?请签出modulefinder,我是这样做的,但对我来说,它只找到其他包中的includes。文档不是很有用。如果这回答了您的问题,请将其标记为这样。我将在32分钟后;)