ネットワークが切断されたときにPythonコードを再起動するにはどうすればよいですか?

DateMike

APIを介して気象データを取得するサービスとして実行されているPythonコードがあります。

すべてが厄介なネットワーク、つまりネットワークの場合、コード自体は完全に正常に実行されますが、APIデータをプルしているPiのWiFiがドロップし、Pythonコードが停止しているように見えることがあります。

最も基本的なログを提供する小さなコード行がありますが、それを大幅に改善したいと思います。ログコードはdatetime.nowを提供するだけなので、コードが最後に実行されたのはいつかを確認できます。

#!/usr/bin/python3

#import modules
import cymysql
from time import sleep
from urllib.request import urlopen
import json
import datetime

#set MySQl Variables
host = "localhost"
user = "xxx"
password = "xxx"
schema = "xxx"

#connect to MySQL DB
db = cymysql.connect(host, user, password, schema)
curs = db.cursor()

#set api key for DarkSky API
apikey="xxx"
# Latitude & longitude
lati="-26.20227"
longi="28.04363"

# Add units=si to get it in sensible ISO units.
url="https://api.forecast.io/forecast/"+apikey+"/"+lati+","+longi+"?units=si"

#begin infinite loop
while True:

        #convert API reading to json and readable array 'weather'
        meteo=urlopen(url).read()
        meteo = meteo.decode('utf-8')
        weather = json.loads(meteo)

        #set variables for current weather
        cTemp = (weather['currently']['temperature'])
        cCond = (weather['currently']['summary'])
        cRain1 =  (weather['currently']['precipProbability'])
        cRain2 = cRain1*100
        cIcon = (weather['currently']['icon'])
        oaSum = (weather['daily']['summary'])

        #print variables - for testing purposes
        #print (cTemp)
        #print (cCond)
        #print (cRain2)
        #print (cIcon)
        #print (oaSum)

        #extract daily data from 'weather' array
        daily = (weather['daily']['data'])

        #create new arrays for daily variables
        listHigh = []
        listLow = []
        listCond = []
        listRain = []
        listIcon = []

        #set daily variables
        for i in daily:
                listHigh.append(i['temperatureHigh'])

        for i in range(0,len(listHigh)):
                high1 = listHigh[0]
                high2 = listHigh[1]
                high3 = listHigh[2]
                high4 = listHigh[3]
                high5 = listHigh[4]
                high6 = listHigh[5]
                high7 = listHigh[6]
                high8 = listHigh[7]

        for o in daily:
                listLow.append(o['temperatureLow'])

        for o in range(0,len(listLow)):
                low1 = listLow[0]
                low2 = listLow[1]
                low3 = listLow[2]
                low4 = listLow[3]
                low5 = listLow[4]
                low6 = listLow[5]
                low7 = listLow[6]
                low8 = listLow[7]

        for p in daily:
                listCond.append(p['summary'])

        for p in range(0,len(listCond)):
                cond1 = listCond[0]
                cond2 = listCond[1]
                cond3 = listCond[2]
                cond4 = listCond[3]
                cond5 = listCond[4]
                cond6 = listCond[5]
                cond7 = listCond[6]
                cond8 = listCond[7]

        for m in daily:
                listRain.append(m['precipProbability'])

        for m in range(0,len(listRain)):
                rain1 = listRain[0]
                rain2 = listRain[1]
                rain3 = listRain[2]
                rain4 = listRain[3]
                rain5 = listRain[4]
                rain6 = listRain[5]
                rain7 = listRain[6]
                rain8 = listRain[7]

        #convert rain chance to readable percentage
        prain1 = rain1*100
        prain2 = rain2*100
        prain3 = rain3*100
        prain4 = rain4*100
        prain5 = rain5*100
        prain6 = rain6*100
        prain7 = rain7*100
        prain8 = rain8*100

        for l in daily:
                listIcon.append(l['icon'])

        for l in range (0,len(listIcon)):
                icon1 = listIcon[0]
                icon2 = listIcon[1]
                icon3 = listIcon[2]
                icon4 = listIcon[3]
                icon5 = listIcon[4]
                icon6 = listIcon[5]
                icon7 = listIcon[6]
                icon8 = listIcon[7]

        #print daily variables - for testing purposes
        #print (high1)
        #print (low1)
        #print (cond1)
        #print (prain1)
        #print (icon1)
        #print (high2)
        #print (low2)
        #print (cond2)
        #print (prain2)
        #print (icon2)

        #update data in DataBase
        try:
                sql_update_query = """UPDATE weather SET current_temp = %s, cur$
                varis = (cTemp, cCond, cRain2, cIcon, high1, low1, cond1, prain$
                curs.execute(sql_update_query, varis)
                db.commit()
        except db.Error as error:
                print("Error: {}".format(error))
                db.rollback()

        #write date to log file
        with open ("/home/pi/CoRo/Projects/WeatherMan/weatherlog.txt", mode="w") as file:
                file.write('Last Data was pulled at: %s' %(datetime.datetime.now()))
        #set loop to sleep for 10 minutes and go again
        sleep(600)

データベースコードが切り取られていることは理解していますが、データベースに入力されているのは変数だけであり、動作していることがわかります。

ただし、ネットワークが切断されると、コードは停止し、データベースには最後にポーリングされたAPIデータが残ります。

APIの取得に失敗した場合、Pythonコードを再起動するにはどうすればよいですか?

前もって感謝します、

Quernon

気象データを関数または個別のモジュールとしてプルするコードの部分を書き直すことができます。これにより、ネットワーク接続が機能している場合にのみ呼び出すことができます。以下のいくつかの擬似コード:

if network_connection:
    pull_weather_data()
else:
    do_something()

do_something() ネットワークアダプタをリセットするなど、ネットワークに再接続するための作業である可能性があります。

ルーターまたはGoogleのDNSサーバー(8.8.8.8または8.8.4.4)のような外部IPにpingを実行することで、ネットワーク接続の状態を判断できます。

ネストされたループを回避するには、このcontinue句を使用できます例えば:

while True:
    if network_connection:
        pull_weather_data()
    else:
        reset_network_connection()
        time.sleep(180) # Sleep for 3 minutes.
        continue

continue先頭にインタプリタバックを送信しますwhileループ。そこから、ネットワーク接続をチェックし、データをプルするか、ネットワーク接続をリセットして、さらに3分間スリープします。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ネットワーク接続/切断でコマンドを起動するにはどうすればよいですか?

分類Dev

Powershellで切断されたネットワークドライブを取得するにはどうすればよいですか?

分類Dev

ネットワークが切断された後にコンピュータを再起動する方法は?

分類Dev

イーサネットネットワーク接続が切断されないようにするにはどうすればよいですか?

分類Dev

イーサネットネットワーク接続が切断されないようにするにはどうすればよいですか?

分類Dev

Windows 10で利用できないネットワークドライブを切断するにはどうすればよいですか?

分類Dev

ネットワークが停止したときにコンピュータを再起動するにはどうすればよいですか?

分類Dev

サーバー上で実行されているPythonスクリプトを作成して、接続が切断された後に自動的に再起動するにはどうすればよいですか?

分類Dev

グラフネットワーク内のノード(アークノード?)の切断された領域をセグメント化するにはどうすればよいですか?

分類Dev

クライアントがサーバーから切断した場合、接続を切断するにはどうすればよいですか?

分類Dev

「ネットワーク切断」ポップアップを非アクティブ化するにはどうすればよいですか?

分類Dev

ネットワークの切断が原因でユーザーがPhoenixチャネルを離れたかどうかを検出するにはどうすればよいですか?

分類Dev

ネットワークが切断されたときにコマンドを自動的に実行する方法

分類Dev

ネットワークが切断されたときに失われるdesktop.iniはどれですか?

分類Dev

クライアントが突然切断した後、サーバーソケットを存続させるにはどうすればよいですか?

分類Dev

ユーザーが離れた後、音声チャネルから不和ボットを切断するにはどうすればよいですか?

分類Dev

Ubuntu 17.10でWi-Fiネットワークを切断するにはどうすればよいですか?

分類Dev

PowerShell で接続が切断された後に FTP アップロードを再開するにはどうすればよいですか?

分類Dev

iOSでネットワークが導入されたときにサーバーと自動同期するにはどうすればよいですか?

分類Dev

リバースsshトンネルが突然/不潔に切断されたときにSSHサーバーのポートを解放するにはどうすればよいですか?

分類Dev

例外が発生したときにタスクのチェーンを切断するにはどうすればよいですか?

分類Dev

サーバーが切断された後、またはOPC UA miloで再起動した後の再サブスクライブを処理するにはどうすればよいですか?

分類Dev

デバイスが切断されたときにBLEタスクをキャンセルするにはどうすればよいですか?

分類Dev

QuickBloxチャット:別のユーザーが切断したことを検出するにはどうすればよいですか?

分類Dev

同じネットワーク上の他のホストがインターネット接続を切断しないようにするにはどうすればよいですか?

分類Dev

同じネットワーク上の他のホストがインターネット接続を切断しないようにするにはどうすればよいですか?

分類Dev

インターネットから切断された場合、自動的に再起動できますか?

分類Dev

イーサネットが切断されているときにコマンドを実行する

分類Dev

Powershellを使用して切断されたネットワークカードに静的IPを設定することは可能ですか?

Related 関連記事

  1. 1

    ネットワーク接続/切断でコマンドを起動するにはどうすればよいですか?

  2. 2

    Powershellで切断されたネットワークドライブを取得するにはどうすればよいですか?

  3. 3

    ネットワークが切断された後にコンピュータを再起動する方法は?

  4. 4

    イーサネットネットワーク接続が切断されないようにするにはどうすればよいですか?

  5. 5

    イーサネットネットワーク接続が切断されないようにするにはどうすればよいですか?

  6. 6

    Windows 10で利用できないネットワークドライブを切断するにはどうすればよいですか?

  7. 7

    ネットワークが停止したときにコンピュータを再起動するにはどうすればよいですか?

  8. 8

    サーバー上で実行されているPythonスクリプトを作成して、接続が切断された後に自動的に再起動するにはどうすればよいですか?

  9. 9

    グラフネットワーク内のノード(アークノード?)の切断された領域をセグメント化するにはどうすればよいですか?

  10. 10

    クライアントがサーバーから切断した場合、接続を切断するにはどうすればよいですか?

  11. 11

    「ネットワーク切断」ポップアップを非アクティブ化するにはどうすればよいですか?

  12. 12

    ネットワークの切断が原因でユーザーがPhoenixチャネルを離れたかどうかを検出するにはどうすればよいですか?

  13. 13

    ネットワークが切断されたときにコマンドを自動的に実行する方法

  14. 14

    ネットワークが切断されたときに失われるdesktop.iniはどれですか?

  15. 15

    クライアントが突然切断した後、サーバーソケットを存続させるにはどうすればよいですか?

  16. 16

    ユーザーが離れた後、音声チャネルから不和ボットを切断するにはどうすればよいですか?

  17. 17

    Ubuntu 17.10でWi-Fiネットワークを切断するにはどうすればよいですか?

  18. 18

    PowerShell で接続が切断された後に FTP アップロードを再開するにはどうすればよいですか?

  19. 19

    iOSでネットワークが導入されたときにサーバーと自動同期するにはどうすればよいですか?

  20. 20

    リバースsshトンネルが突然/不潔に切断されたときにSSHサーバーのポートを解放するにはどうすればよいですか?

  21. 21

    例外が発生したときにタスクのチェーンを切断するにはどうすればよいですか?

  22. 22

    サーバーが切断された後、またはOPC UA miloで再起動した後の再サブスクライブを処理するにはどうすればよいですか?

  23. 23

    デバイスが切断されたときにBLEタスクをキャンセルするにはどうすればよいですか?

  24. 24

    QuickBloxチャット:別のユーザーが切断したことを検出するにはどうすればよいですか?

  25. 25

    同じネットワーク上の他のホストがインターネット接続を切断しないようにするにはどうすればよいですか?

  26. 26

    同じネットワーク上の他のホストがインターネット接続を切断しないようにするにはどうすればよいですか?

  27. 27

    インターネットから切断された場合、自動的に再起動できますか?

  28. 28

    イーサネットが切断されているときにコマンドを実行する

  29. 29

    Powershellを使用して切断されたネットワークカードに静的IPを設定することは可能ですか?

ホットタグ

アーカイブ