0

ユーザーが生成したスクリプトを受け取って実行できるPython Webソケットクライアントを作成しようとしています。

私のコードはこれまでのところ次のようになります。

import config
import websocket
import time, ssl, json, importlib, sys
#when putting "import script" here def main is found, but not reloaded later on

script_loaded = False

def import_script(ws): #import/reload script module
    global script_loaded
    global script
    try:
        if script_loaded:
            importlib.reload(script)
        else:
            import script
            script_loaded = True
    except Exception as e:
        iot.report_error(ws, 'Loading Script', str(sys.exc_info()[0]), str(e))
        print('Error: ' + str(sys.exc_info()[0]) + ': ' + str(e))

class iot:
    def report_error(ws, place, etype, error):
        msg = json.dumps({"context": 3, "place": place, "type": etype, "error": error}, sort_keys=True)
        ws.send(msg)
    def write(ws, socket, data):
        msg = json.dumps({"context": 2, "socket": socket, "data": data}, sort_keys=True)
        ws.send(msg)
    def display(data):
        print(data)
    def start(ws): #start script module (def main)
        try:
            script.main(ws)
        except Exception as e:
            iot.report_error(ws, 'Executing Script (main())', str(sys.exc_info()[0]), str(e))
            print('Error: ' + str(sys.exc_info()[0]) + ': ' + str(e))


connectionEstablished = False
def on_message(ws, message):
    global connectionEstablished
    global script_loaded
    global script
    try:
        decoded_data = json.loads(message)
        if decoded_data['context'] == 0: #Log on
            connectionEstablished = True
        elif decoded_data['context'] == 1: #Receive Script
            if connectionEstablished:
                file = open('script.py','w')
                file.write("from iot_daemon import iot\n\n")
                file.write(decoded_data['script']) #write received script to file (works)
                import_script(ws) #import/reload script
                if script_loaded:
                    iot.start(ws) #start script module (def main)
    except Exception as e:
        print('Failed to process string: ' + str(e))

def on_error(ws, error):
    print('WebSocket Error: ' + error)

def on_close(ws):
    print("Closed.")

def on_open(ws):
    print("Connected.")
    msg = json.dumps({"context": 0, "type": 0, "key": config.key}, sort_keys=True)
    ws.send(msg)

if __name__ == "__main__":
    while True:
        if config.debugMode:
            websocket.enableTrace(True)
        ws = websocket.WebSocketApp(config.serverURL,
                                  on_message = on_message,
                                  on_error = on_error,
                                  on_close = on_close)
        ws.on_open = on_open
        ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})
        time.sleep(5)
        print("Reconnecting...")

スクリプトを受け取ったように見えますが (テキスト エディターで見ると script.py が更新されます)、どういうわけか新しいバージョンを再読み込みして実行するとうまくいきません (クライアントが再起動/起動されたとき、または既存のスクリプト バージョンが常に実行されます)。スクリプトの先頭にある import ステートメントが省略されている場合、スクリプトはまったく実行されません)。

どんな助けでも大歓迎です。前もって感謝します。

4

1 に答える 1

0

問題は実際には非常に単純なものでした: Python は、現時点で FileObject として開かれているモジュールをリロードできません。したがって、「file.close()」を追加するだけで解決しました。

于 2015-12-13T15:38:17.177 に答える