2009-11-06 85 views
7

我想描述一個相對CPU密集型的自定義管理命令(使用PIL呈現圖像)。當我使用以下命令我得到的各種Django的模塊(管理,ORM等)在我的分析結果:如何獨立配置Django自定義管理命令

python -m cProfile manage.py testrender 

我已刪除了全部進口,可以潛在地導入Django的,但我猜下面是罪魁禍首:

from django.core.management.base import BaseCommand, CommandError 

有沒有辦法可以過濾掉cProfile結果? (只顯示文件名,沒有路徑)或者,有沒有其他方法可以從分析中排除/包含各個模塊/軟件包?

+0

也許你自己grep? – Geo 2009-11-06 12:02:57

+0

@Geo grep沒有幫助,因爲沒有給出文件路徑。只有文件名被打印出來。現在假設我有utils.py,我想要配置文件,並且Django中有另一個utils.py。 – muhuk 2009-11-06 13:07:27

回答

13

我解決了這個問題,通過以下方式:

from cProfile import Profile 
from django.core.management.base import BaseCommand 


class Command(BaseCommand): 
    ... 

    def _handle(self, *args, **options): 
     # Actual code I want to profile 
     pass 

    def handle(self, *args, **options): 
     if options['profile']: 
      profiler = Profile() 
      profiler.runcall(self._handle, *args, **options) 
      profiler.print_stats() 
     else: 
      self._handle(*args, **options) 

這樣分析統計的_handle範圍內聚集。因此,而不是:

python -m cProfile manage.py testrender 

我得跑:

python manage.py testrender --profile 

這是更好的。

+0

很好的回答,謝謝分享。 – Hassek 2012-06-29 20:44:26

+1

看起來像這個不再有效的Django的變化,但我從中找到了它。 [這是一個更新的例子](https://gist.github.com/4236077)。 – Tom 2012-12-07 20:03:30

0

如果我找不到任何答案。 Gprof2Dot作爲explained here可以是一個可接受的黑客。

它不會過濾掉我不感興趣的模塊,但希望它可以更容易地檢查結果,以視覺方式分隔我的代碼和Django模塊。

0

將PIL功能分成它自己的模塊中的函數/類,並從管理命令中導入。然後,您可以獨立於Django測試/剖析PIL功能。

+0

就像你說的,在一個單獨的模塊中並從命令導入。問題是如何獨立分析。我甚至不需要超級隔離,我只是不想要50個相關條目和950個不相關的條目。你想讓我發佈一些代碼嗎? – muhuk 2009-11-06 17:06:50

+0

我不明白問題在哪裏。如果你已經把它分離出來了它自己的模塊(它根本沒有對Django的引用),你不能寫一個簡單的測試工具來鍛鍊這個模塊嗎?我看不到如何在你的配置文件輸出中有任何Django代碼。 – 2009-11-06 17:48:44

+0

創建你的意思是另一個可執行文件?這將是一個解決方案。我只是試圖找出是否有可能以某種方式使用Django管理命令。 – muhuk 2009-11-06 18:27:00