2011-11-11 5 views
0

私は、起動時間が非常に遅いアプリケーションがあります。プロファイルGUIアプリケーションのブートストラップ

理論的には、GUIが起動するとただちに終了したいと考えています。今まで私は手作業でやっていましたが、うまくいったのですが、もっと良い方法があるのだろうかと思っています...

解決策はもちろん、 "sys.exit"終了しますが、コードを変更する必要があります。

ファイルを変更せずにいくつかの条件でファイルを終了する手段がありますか?

+0

それを書き換え、あなたのアプリが起動に時間がかかる、とあなたは理由を知りたいので、あなたはそれがより速く起動させるためにそれを修正することができると言うしようとしていますか?もしそうなら、あなたは* [これを試してみてください](http://stackoverflow.com/questions/4295799/how-to-improve-performance-of-this-code/4299378#4299378)*することもできます。 –

+0

あなたはそれが正しいリンクだと確信していますか? とにかくはい、アプリは長い時間がかかりますが、私はそれをプロファイルする方法を知っていますが、私が知らないのはブートストラップだけをプロファイルする方法です。 私は基本的に、GUIが起動するとすぐに終了させる必要があります。 –

+0

あなたのアプリの起動中にCtrl-Cを押すことはできませんか?その後、Pythonは停止し、スタックを表示します。それはその時に何をしているのかを正確に教えてくれるでしょう。そんなに耐え難いほどの時間を費やしているので、あなたが無駄なことをやっていないチャンスは非常に小さいです。確かに、それを数回してください。これはプロファイリングと同じではありません。それはそうだと思うかもしれませんが、そうではありません。プロファイラよりもはるかに迅速に問題に直面します。 –

答えて

0

本当に「終了点」を正確に設定するには、コードに触れることなく正確に設定することは些細なことではありません。

ここ http://www.doughellmann.com/PyMOTW/sys/tracing.html

示すように、単にいくつかの出口ラインを追加し、だから、私のためのソリューションは、実際にコードを変更することで、sys.settraceで遊んで、私が思うに、しかし行うことができますポイント。

私はdifflibを使用していたが、それは機能にパッチを適用していないので、私は以下の小さなスクリプトを作成し、その短い中: - ファイル を読み込む - 挿入/同じインデントと挿入時に1行を(削除 )前の行として -

#TODO: must make sure about the indentation 
import argparse 
import re 
import sys 

PATCH_LINE = "import sys; sys.exit(0) # PATCHED" 


def parse_arguments(): 
    # take the file and the line to patch, or maybe we can take a 
    # diff file generated via uniform_diff 
    parser = argparse.ArgumentParser(description='enable and disable the automatic exit') 
    parser.add_argument('file', help='file to patch') 

    parser.add_argument('line', help='line where to quit') 

    parser.add_argument('-m', '--msg', 
         default=PATCH_LINE) 

    parser.add_argument('-d', '--disable', 
         action='store_true') 

    return parser.parse_args() 


if __name__ == '__main__': 
    ns = parse_arguments() 
    text = open(ns.file).readlines() 
    line_no = int(ns.line) 

    if ns.disable: 
     # the line should not be necessary in that case? 
     text.remove(text[line_no]) 
    else: 
     # count spaces 
     prev = text[line_no - 1] 
     m = re.match('\s*', prev) 
     to_insert = m.group() + ns.msg 
     print("inserting line %s" % to_insert) 
     text.insert(line_no, to_insert) 

    open(ns.file, 'w').writelines(text) 
関連する問題