2016-04-08 7 views
2

以下は動作しません。私はWebページに接続するプログラムを持っていますが、接続できないいくつかの問題が原因で時々、プログラムがエラーの後に完全に再起動するようにします。メイン関数がプログラムを呼び出すとしたら、どうすればこのようなコードを書くことができますか?したがって、Pythonの使用try/except内でそれを行うにはエラーで終了した後、自動的にPythonコードを再起動しますか?

import numpy as np 

def main(): 
    np.load('File.csv') 

for i in range(1, 10): 
    try: 
     main() 
    except Exception as e: 
     print e 
     print 'Restarting!' 
     main() 

答えて

2

:簡単な手順について

import numpy as np 

def main(): 
    np.load('File.csv') 

for i in range(1, 10): 
    try: 
     main() 
    except Exception as e: 
     print e 
     print 'Restarting!' 
     continue 
    else: 
     break 

を、これは動作しますが、あなたのコードはより複雑になれば、try/exceptブロックにあなたの全体main()機能を置くことは、例外を非表示にすることができますし、プログラムをデバッグするのが難しくなります。したがって、私はpythonの外で再起動を処理することをお勧めします。 bashスクリプトで実行します。

1

このような(Webページに接続する)場合は、接続を試行する回数ではなく、時間に基づいて上限を設定する方がよい場合があります。だからではなく、whileループを使用します。

import numpy as np 
import time 

def main(): 
    np.load('file.csv') 

start = time.time() 
stop = start + 5 
attempts = 0 
result = 'failed' 

while True: 
    if time.time()<stop: 
     try: 
      main() 
     except Exception as e: 
      attempts += 1 
      print e 
      time.sleep(0.1) # optional 
      print 'Restarting!' 
      continue 
     else: 
      result = 'succeeded' 
    print 'Connection %s after %i attempts.' % (result, attempts) 
    break 

オプション:各試行が失敗した後、私は100ミリ秒のポーズが含まれています。これは時折接続を確立するのに役立ちます。その後

あなたが他のプロジェクトのために、将来的に使用できる機能にアップ全体を包む:

import numpy as np 
from retry import retry 

def main(): 
    np.load('file.csv') 

retry(main, 5, 0.1) 

試験方法:

class RetryTest(): 
    def __init__(self, succeed_on = 0, excp = Exception()): 
     self.succeed_on = succeed_on 
     self.attempts = 0 
     self.excp = excp 
    def __call__(self): 
     self.attempts += 1 
     if self.succeed_on == self.attempts: 
      self.attempts = 0 
     else: 
      raise self.excp 

retry_test1 = RetryTest(3) 
retry(retry_test1, 5, 0.1) 
# succeeded after 3 attempts. 
retry_test2 = RetryTest() 
retry(retry_test2, 5, 0.1) 
# failed after 50 attempts. 

# retry.py 

import time 

def retry(f, seconds, pause = 0): 
    start = time.time() 
    stop = start + seconds 
    attempts = 0 
    result = 'failed' 

    while True: 
     if time.time()<stop: 
      try: 
       f() 
      except Exception as e: 
       attempts += 1 
       print e 
       time.sleep(pause) 
       print 'Restarting!' 
       continue 
      else: 
       result = 'succeeded' 
     print '%s after %i attempts.' % (result, attempts) 
     break 

は今、ちょうどこの操作を行います

+0

良好なコード – auryndb

+0

を助けます。今すぐ修正。 –

1

ここで再帰関数を使用すると、コードを自動的に再起動することができます。次のように試行回数を定義するsetrecursionlimit()を使用:それは実際には少し早く壊れた@auryndb

import numpy as np 
import sys 
sys.setrecursionlimit(10) # set recursion depth limit 


def main(): 
    try: 
     a = np.load('file.csv') 
     if a: 
      return a 
    except Exception as e: 
     return main() 

result = main() 
print result 

希望これは:)

関連する問題