【问题标题】:Python create makefile of dependenciesPython创建依赖项的makefile
【发布时间】:2018-10-09 07:50:12
【问题描述】:

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

plot.pdf: my_script.py
    python my_script.py -o $@

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

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.pdfmy_data.txt 的依赖关系。我的 Makefile 设置为获取所有这些自动生成的 Makefile。

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

【问题讨论】:

  • 您可能还对pydoit.org 工具感兴趣。这是一个类似make的系统,可以通过python进行编程。
  • pydoit 看起来确实很有趣,我会在下一个项目中考虑它。

标签: python makefile


【解决方案1】:

终于找到了让我开心的答案:

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 脚本以及我的用户脚本。

【讨论】:

  • 如果这回答了你的问题,请这样标记。
  • 我会在 32 分钟内 ;)
【解决方案2】:

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

import my_other_script
print(my_other_script.__file__)

【讨论】:

  • 谢谢,这已经解决了我需要的一半。有没有办法对所有导入的 user 脚本执行此操作?我的意思是没有明确列出它们。
  • 我不明白。导入用户脚本时,必须使用import 语句明确列出它,对吗?
  • 我做到了,但对我来说,它只找到了其他包中的包含。文档不是很有帮助。
【解决方案3】:

可以做到这一点的一种方法,例如,如果我想知道 os 模块的位置。

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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-04
    • 2016-09-14
    • 2012-09-28
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多