2012-07-12 36 views
2

我有一堆Python腳本在管道中用來讀取文件,並將數據轉換爲創建並填充sqlite3數據庫。如何爲python腳本編寫makefile來更新數據庫?

我使用一個makefile來做到這一點;由於我的一些輸入文件相當大,即5GB,因此需要相當長的時間來處理,所以我不希望makefile只在編輯一個文件時重新運行整個管道。

但是,因爲它們都編輯相同的文件,即數據庫文件,它們都是僞造的目標。有沒有辦法讓它重新生成已編輯文件的目標?

下面是我使用的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 
+0

您是否嘗試過讓他們產生「臨時」目標文件以表明他們已經建立(只是頭腦風暴)? – jdi 2012-07-12 04:53:46

+0

爲了清楚起見,當*腳本本身*發生更改時,您希望重新運行腳本?或者當某些內容修改了腳本的*輸入文件*時?如果是後者,您是否事先知道每個腳本會讀取哪些文件? – Beta 2012-07-12 05:14:21

+0

謝天謝地,輸入文件是靜態的,不會被編輯。 – mercifulhop 2012-07-12 05:27:59

回答

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 
+0

不錯。驗證是否有效。它的工作原理是[$?](http://www.gnu.org/software /make/manual/make.html#Automatic-Variables)擴展爲「自文件構建以來發生更改的所有依賴關係」。$$僅僅是一種轉義機制,意味着它是Bash $而不是Makefile $。 – mgiuca 2012-07-14 00:13:35

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... 
+0

感謝馬特,不幸的是我對此懷疑很多,但它確實讓我覺得不夠高雅:(... – mercifulhop 2012-07-12 05:29:12

+0

這是一種不雅,但也是不可避免的,我甚至不知道是否有更時髦的製造系統可以讓它變得更容易。底線是你需要保持一些關於「自上次更新之後已經爲blogs.db貢獻了create.py」的狀態嗎?這意味着你需要一個時間戳來記錄上一次create.py的貢獻blogs.db。理解時間戳的唯一方法是通過查看文件mtime,所以你需要另一個文件。 – mgiuca 2012-07-12 08:34:58

相關問題