2010-03-27 41 views
15

(我預見到這個問題可能發生在3個月前,並且被告知需要努力避免它。昨天,我被它咬了,很難,現在它我想要修復它。)當對應的py被移動時,自動刪除pyc文件(Mercurial)

如果我將我的一個Python源文件移動到另一個目錄中,我需要記住告訴Mercurial它移動了(hg move)。

當我使用Mercurial將新軟件部署到我的服務器時,它會仔細刪除舊的Python文件並在新目錄中創建它。

但是,Mercurial並不知道同一目錄中的pyc文件,並將其留在後面。舊的pyc優先被相同目錄中的其他模塊用於新的python文件。

接下來的事情並不是鬧着玩的。

當我移動python文件時,如何說服Mercurial自動刪除舊的pyc文件?還有另一種更好的做法嗎?嘗試記住從所有Mercurial存儲庫中刪除pyc文件不起作用。

回答

3

我實際上已經完成:

1)我正在考慮尼古拉斯騎士的有關使用適當的部署策略建議。我一直在閱讀有關BuildoutCollective.hostout以瞭解更多信息。我需要決定這樣的重量級戰略是否值得我的項目相對簡單的要求。

2)我已經通過Ry4an的更新掛鉤的概念,在短期內,直到我決定。

3)我忽略Ry4an的約矯枉過正警告,並寫了一個Python腳本只刪除流浪pyc文件。

#!/usr/bin/env python 
""" Searches subdirectories of the current directory looking for .pyc files which 
    do not have matching .py files, and deletes them. 

    This is useful as a hook for version control when Python files are moved. 
    It is dangerous for projects that deliberately include Python 
    binaries without source. 
""" 
import os 
import os.path 
for root, dirs, files in os.walk("."): 
    pyc_files = filter(lambda filename: filename.endswith(".pyc"), files) 
    py_files = set(filter(lambda filename: filename.endswith(".py"), files)) 
    excess_pyc_files = filter(lambda pyc_filename: pyc_filename[:-1] not in py_files, pyc_files) 
    for excess_pyc_file in excess_pyc_files: 
     full_path = os.path.join(root, excess_pyc_file) 
     print "Removing old PYC file:", full_path 
     os.remove(full_path) 

我的更新掛鉤現在把這塊,而不是由別人提出的「查找」命令。

+2

這會工作。如果你願意,你可以直接調用你的.py文件的子例程。您只需將其命名爲掛鉤並提供.py文件的路徑。這將節省你一個整體的Python的虛擬機。 – 2010-03-27 20:27:50

+0

謝謝,Ry4an。希望我可以給你更多的建議代表。 – Oddthinking 2010-03-28 01:58:22

+1

對於後人來說,這個'find'命令加上sh循環是類似的:'find。 -path'./virtualenv/*'-prune -or -name'* .pyc'-print |同時讀f;做[[! -f「$ {f%?}」]] && echo「$ f」&& rm「$ f」;完成' – Dougal 2012-05-21 22:29:04

6

您需要:

1)實際部署的基礎設施,即使它只是一個shell腳本,該做的一切。克隆/檢出來自源代碼控制的更新副本不是部署策略。

2)任何部署系統都應該完全清理目錄結構。我通常的選擇是,每個部署都發生在一個以date + timestamp命名的新目錄中,並且更新一個符號鏈接(名稱類似「current」)以指向新目錄。如果出現問題,這將爲您在每臺服務器上提供麪包屑。

3)修復正在運行的Python代碼。新的.py源文件應始終優先於緩存的.pyc文件。如果這不是你所看到的行爲,那是一個錯誤,你需要弄清楚它爲什麼會發生。

+0

Python很容易,將.py文件(以及其他任何你需要的)複製出來,並忽略.pyc文件(當然,你明白了)。 – bigredbob 2010-03-27 05:57:10

+3

要點3,它沒有發生的原因是因爲.py不存在。沒有.py目前沒有時間比較,python不會忽略沒有.py的pyc。 – 2010-03-27 06:07:29

+0

請詳細說明1)。除了這裏討論的.pyc文件的明顯例外之外,「hg pull -u」策略對我來說運行良好。 我應該提到,我只有一臺目標機器(儘管我有幾個存儲庫用於測試)。我的登臺機器和生產機器是相同的,但使用不同的帳戶和配置文件,所以他們不會彼此踩踏。此項目的性能,可用性和擴展性並不重要。 – Oddthinking 2010-03-27 09:39:41

9

如何在服務器端使用update hook?將這個版本庫的.hg目錄的hgrc文件:

[hooks] 
update = find . -name '*.pyc' | xargs rm 

這將刪除當你在服務器上更新所有pyc文件。如果你擔心重建所有.pyc文件的代價,你總是可以在鉤子上更加聰明一些,並且只刪除沒有.py的.pyc文件,但這可能是矯枉過正的。

+5

找。 -name'* .pyc'-delete – mkotechno 2010-03-27 07:26:16

+0

謝謝。這是我需要的信息。我繼續前進並過度使用。看到我對這個問題的回答。 – Oddthinking 2010-03-27 14:19:48

16
  1. 不要將.pyc文件存儲在存儲庫中。
  2. Automatize .pyc刪除:find。 -name'* .pyc'-delete
  3. 在Python中開發use -B參數。
+3

另外,預編譯發行版中的所有.pyc文件。您可以通過標記回購來部署,並推送到生產環境等。編譯.pyc文件適合於此。對於其他語言編譯二進制文件是在陽光下最自然的事情。 – 2010-03-27 08:51:46

+1

1)我沒有在存儲庫中存儲.pyc文件。 2)我喜歡這個命令。有關更多信息,另請參閱http://stackoverflow.com/questions/785519/remove-all-pyc-files-from-a-project。我想我正在尋求幫助「自動化」。 3)我看了這個。不要爲導入的模塊存儲字節碼?爲什麼不? – Oddthinking 2010-03-27 09:35:38

+0

爲什麼這個答案有16個upvotes當它不回答這個問題? – Oddthinking 2014-10-07 22:13:41

1

我使用.hgignore文件來跳過版本化我所有的.pyc和.py〜(編輯器的臨時文件)。例如,這是我的版本:

# use glob syntax. 
syntax: glob 

.directory 
*.pyc 
*~ 
*.o 
*.tgz 
*.tbz2 
*.gz 
*.bz2 

還加入了對更新的鉤子將其刪除也是一個有趣的伎倆,如果你想不僅忽視噪聲,而且從當地的工作區中刪除。

+0

謝謝,edomaur,但我已經有一個.hgignore文件(實際上是兩個交叉項目和另一個項目特定的。) 我不是版本控制.pyc文件。這不是根本問題。 – Oddthinking 2010-03-27 13:56:03

+0

好吧,我不確定你的目標是什麼,但我想我現在已經明白了。 – edomaur 2010-03-29 07:23:12

2

這裏有一個UNIX的一行,將每次運行hg update時間刪除pyc文件。

添加到您的hgrc文件:

[hooks] 
preupdate.cleanpyc = hg status --no-status --removed --deleted --include "**.py" --rev .:$HG_PARENT1 --print0 | xargs -0 -I '{}' rm -f '{}c' 

這只是運行在更新前,並得到時進行更新,將被刪除或刪除所有.py文件,然後刪除相應的pyc文件。

這裏是它是如何工作的快速崩潰:

hg status --no-status --removed --deleted --include "**.py" --rev .:$HG_PARENT1 

這得到或刪除所有文件(例如hg forget)當前修訂.和目的地($HG_PARENT)之間刪除(hg rmhg mv等)。如果您使用該功能,則可以添加--subrepos以獲取子存儲庫中的所有更改。

xargs -0 -I '{}' rm -f '{}c' 

這只是增加了一個「C」從hg status返回每個文件名末尾,並試圖將其刪除。如果.pyc文件不存在,rm-f標誌可確保它不會出錯。

注意,自動善變的更新後刪除空目錄,但孤立的pyc文件往往會導致圍繞左目錄。由於這是在更新之前運行的,它確保空目錄被正確刪除。

+0

你能解釋它是如何工作的嗎?它似乎只包含以前存儲在Mercurial中的(刪除/刪除).pyc文件,但沒有.pyc文件存儲在Mercurial中。 – Oddthinking 2014-11-06 04:41:59

+0

你是對的,糾正了一個錯字。現在應該清楚了,但我也加了一個更全面的解釋 – chadrik 2014-11-09 17:17:17

0

我使用這個腳本刪除當前文件夾中的pyc文件,此腳本可以單獨使用,或者將其包含在退出功能時刪除pyc文件ü退出。

import os 
files = [f for f in os.listdir('.') if os.path.isfile(f) and '.pyc' in str(f)] 
for f in files : os.unlink(os.getcwd()+'/'+f) 
相關問題