3

我有一堆 Python 脚本,我在管道中使用它们来读取文件,并转换数据以创建和填充 sqlite3 数据库。

我使用makefile来做到这一点;由于我的一些输入文件相当大,即 5GB,因此需要相当长的时间来处理,我不希望 makefile 在我只编辑一个文件时重新运行整个管道。

然而,因为它们都编辑同一个文件,即数据库文件,它们实际上都是假目标。有没有办法让它只重新运行已经编辑过文件的目标?

这是我正在使用的生成文件:

.PHONY: all
    all: blogs.db

    blogs.db: create users posts likes blogs blog_likes

    .PHONY: create
    create: create.py
        $(PYTHON) create.py

    .PHONY: users
    users:  users.py
        $(PYTHON) users.py

    .PHONY: posts
    posts:  posts.py
        $(PYTHON) posts.py

    .PHONY: likes
    likes:  likes.py
        $(PYTHON) likes.py

    .PHONY: blogs
    blogs:  blogs.py
        $(PYTHON) blogs.py

    .PHONY: blog_likes
    blog_likes: blog_likes.py
        $(PYTHON) blog_likes.py
4

2 回答 2

1

如果目标是虚假的,那么每次有人依赖它们时,它们都会重建。正如@jdi 所说,让每个目标都是创建虚拟文件的真实目标,以表明它们已经构建。然后它们将在 .py 文件仅更改时重新运行。

blogs.db: create.dummy users.dummy posts.dummy likes.dummy blogs.dummy \
    blog_likes.dummy

create.dummy: create.py
    $(PYTHON) create.py
    touch create.dummy

etc...
于 2012-07-12T05:09:26.727 回答
1

您不需要虚拟文件,只要这些脚本正在修改数据库:

SCRIPTS = create.py users.py posts.py likes.py blogs.py blog_likes.py

.PHONY: all
all: blogs.db

blogs.db: $(SCRIPTS)
    @for s in $?; do $(PYTHON) $$s; done
于 2012-07-12T11:13:36.330 回答