Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为python脚本编写makefile更新数据库?_Python_Sqlite_Makefile - Fatal编程技术网

如何为python脚本编写makefile更新数据库?

如何为python脚本编写makefile更新数据库?,python,sqlite,makefile,Python,Sqlite,Makefile,我有一堆Python脚本,我在管道中使用它们来读取文件,并转换数据以创建和填充sqlite3数据库 我使用一个makefile来完成这项工作;由于我的一些输入文件相当大,即5GB,因此需要相当长的时间来处理,我不希望在只编辑一个文件时makefile重新运行整个管道 但是,由于它们都编辑同一个文件,即数据库文件,因此实际上它们都是虚假目标。是否有办法使make只重新运行已编辑其文件的目标 下面是我正在使用的makefile: .PHONY: all all: blogs.db

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

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

但是,由于它们都编辑同一个文件,即数据库文件,因此实际上它们都是虚假目标。是否有办法使make只重新运行已编辑其文件的目标

下面是我正在使用的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

如果目标是假的,每当有人依赖他们时,他们就会重建。相反,每个目标都是一个真正的目标,它创建了一个虚拟文件,如@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...

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

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

您是否尝试过让他们生成一个“temp”目标文件,以表明他们已经构建好了(只是头脑风暴)?或者当某些内容修改了该脚本的输入文件时?如果是后者,您事先知道每个脚本将读取哪些文件吗?谢天谢地,输入文件是静态的,不会被编辑。谢谢Matt,不幸的是我也这么怀疑,但这确实让我觉得相当不雅:(…这有点不雅观,但也是不可避免的。我甚至不知道是否有更流行的make系统可以让它变得更简单。底线是,您需要保持一些状态,即“自上次更新以来create.py是否对blogs.db做出了贡献?”这意味着您需要一个时间戳来记录create.py最后一次贡献给blogs.db的时间。唯一的方法是通过查看文件mtime来理解时间戳,因此您需要另一个文件.Nice。请验证此方法是否有效。之所以有效,是因为[$?]()扩展为“自构建文件以来已更改的所有依赖项”$$只是一个转义机制,这意味着它是Bash$,而不是Makefile$。