2016-05-25 7 views
1

データベース内の50,000項目以上のPythonスクリプトを実行していると、1項目あたり約10秒かかるので停止したい。try/except文で "except"を有効にするだけでpythonスクリプトを閉じる方法

しかし、コードがtry以外の部分にある間にCtrl + Cを押すだけで、私のプログラムはexpect文を入力してその項目を削除してから続行します。プログラムを閉じるための唯一の方法は、私がちょうど運が良ければtryステートメントではなく、この方法でアイテムを繰り返し削除することです。

tryステートメントを強制終了するだけでスクリプトを終了するにはどうすればよいですか?

EDIT 1

私はこのようになります文を持っている:

:コードをdbに

for item in items: 
    try: 
     if is_item_gone(content) == 1: 
     data = (item['id']) 
     db.update('UPDATE items SET empty = 0 WHERE id = (%s);', data) 
     else: 
      do alot of stuff 
    except: 
     data = (item['id']) 
     db.delete('...') 

EDIT 2

私の接続のトップは次のようになります

#!/usr/bin/python 
import MySQLdb 
import sys 

class Database: 
.... 
+0

'except'ではなくException'を行います。 – univerio

+0

あなたはどんな例外を捕まえていますか?あなたはほとんど常に悪い考えです除く毛布* *を使用しているので、あなたがして、Ctrl + Cは、私は私のコードは、今追加したプログラム –

+2

問題は、ほぼ確実です。 –

答えて

2

問題がありますあなたは除くで複数を使用することができますキャッチ:

except (KeyError, MySQLdb.Error) as e 

非常に少なくとも、あなたはException as eをキャッチし、エラーを印刷することができます。

for item in items: 
    try: 
     if is_item_gone(content) == 1: 
     data = (item['id']) 
     db.update('UPDATE items SET empty = 0 WHERE id = (%s);', data) 
     else: 
      do alot of stuff 
    except Exception as e: 
     print(e) 
     data = (item['id']) 
     db.delete('...') 

話の教訓は、あなたが期待するとエラーを記録するのも良い考えかもしれませんどのようなキャッチを除き、毛布を使用していないです。 exception-hierarchyは、あなたが捉えているものを正確に見るために読む価値があります。

+0

FYI:isinstance(KeyboardInterrupt、Exception) - > Falseです。 KeyboardInterruptはExceptionから派生しません。 – rrauenza

+0

@rrauenza、True、それはGeneratorExitとSystemExitと同様にBaseExceptionから直接継承します –

0
import signal 
import MySQLdb 
import sys 

## Handle process signals: 
def sig_handler(signal, frame): 
    global connection 
    global cursor 

    cursor.close() 
    connection.close() 

    exit(0) 

## Register a signal to the handler: 
signal.signal(signal.SIGINT, sig_handler) 

class Database: 
    # Your class stuf here. 
    # Note that in sig_handler() i close the cursor and connection, 
    # perhaps your class has a .close call? If so use that. 

for item in items: 
    try: 
     if is_item_gone(content) == 1: 
     data = (item['id']) 
     db.update('UPDATE items SET empty = 0 WHERE id = (%s);', data) 
     else: 
      do alot of stuff 
    except MySQLdb.Error as e: 
     data = (item['id']) 
     db.delete('...') 

これは、任意の時点で登録Ctrl + cのようになります。ハンドラはそれに応じてソケットを終了し、その後良い終了コードである終了コード0で終了します。

これは、キーボード割り込みを捕まえるための「グローバルな」アプローチです。

for item in items: 
    try: 
     if is_item_gone(content) == 1: 
     data = (item['id']) 
     db.update('UPDATE items SET empty = 0 WHERE id = (%s);', data) 
     else: 
      do alot of stuff 
    except MySQLdb.Error as e: 
     print(e) 
     data = (item['id']) 
     db.delete('...') 

あなたがに他の例外を持っている場合:あなたは、あなたがKeyboardInterruptスクリプトが停止しますときに、特定の例外をキャッチした場合、常に悪い考えである以外毛布を使用しているため

+0

投票の時間を減らすために時間を費やしているのであれば、良いスポーツになり、理由を説明できます。私たちの中には、実際に改善しようとしている人もいれば、適切なフィードバックを得ることが難しい人もいます。 (下投票は今行われていることに気がついたが、これを読んでいたり、投票を計画している場合は、メモを書いてください。 – Torxed

+0

私のプログラムにこのコードを含めるだけですか? – Rorschach

+0

私はあなたにdownvoteをしなかったが、私はあなたの解決策が非常にpythonicと見なされないと思う。第一に、OPはすべての例外を捕らえるべきではなく、むしろより具体的でなければならない。 http://stackoverflow.com/questions/15318208/capture-control-c-:第二に、あなたはそれをキャッチしているブロックにローカルにCtrl-C処理コードを続けるだろうにCtrl-C、のためにキャッチする例外がありますで-pythonの私が推測 – rrauenza

1

私はこのように書き換えます:

try: 
    # ... 
except KeyboardInterrupt: 
    sys.exit(1) 
except Exception: # I would use a more specific exception here if you can. 
    data = (item['id']) 
    db.delete('...') 

それとも

try: 
    # ... 
except Exception: # I would use an even more specific exception here if you can. 
    data = (item['id']) 
    db.delete('...') 

のPython 2の例外hiearchyがここで見つけることができます:https://docs.python.org/2/library/exceptions.html#exception-hierarchy

はまた、多くのスクリプトは、のようなもので書かれています底部のこのボイラープレート:

def _main(args): 
    ... 

if __name__ == '__main__': 
    try: 
     sys.exit(_main(sys.argv[1:])) 
    except KeyboardInterrupt: 
     print >> sys.stderr, '%s: interrupted' % _SCRIPT_NAME 
     sys.exit(1) 

あなたは本体にexcept:代わりのexcept Exception:を使用するときは、このトップレベルの例外ブロックはKeyboardInterruptをキャッチすることができていません。 (が実際にCtrl-Cが動作するようにキャッチするのではありません。KeyboardInterruptが呼び出されたときには、よりきれいになります。)

関連する問題