Проблема с Python при выполнении команд, полученных через сокет - PullRequest
1 голос
/ 06 мая 2019

Я создаю Python-сервер для некоторых приложений, работающих на разных компьютерах в доме. Для этого я пытаюсь настроить сервер, отвечающий на команды из любого из этих приложений. Коммутатор сокета работает адекватно, и Python указывает, что команда выполнена, но нет никаких изменений в переменных, которые я ожидал бы изменить.

Я тестирую на Python 3.7.

import sys
import time
import socket

data = "";
result = "";
def server():
    TCP_IP = '127.0.0.1'
    TCP_PORT = 5005
    BUFFER_SIZE = 1024
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((TCP_IP, TCP_PORT))
    s.listen(1)

    conn, addr = s.accept()
    while 1:
        data = conn.recv(BUFFER_SIZE).decode()
        if (len(data)>0):
            try:
                exec(data);
                print("Execution OK of "+data+", result: "+result);
                conn.send(result.encode())  # send the final value back to the client
            except Exception as e:
                print("Error executing: ",data, "  msg: ",str(e));
        else:
            time.sleep(1);
result = "UNINITIALIZED"
server()

Чтобы проверить это, я запускаю следующие команды из другой консоли Python:

import socket
TCP_IP = '127.0.0.1'
TCP_PORT = 5005
BUFFER_SIZE = 1024
MESSAGE = "result='initialized'";
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
s.send(MESSAGE.encode())
data = s.recv(BUFFER_SIZE).decode()
s.close()
print("received data:", data)

Я ожидаю, что после того, как сервер получит данные (что работает нормально), значение «result» должно измениться на «initialized», и я увижу обновленное значение как на сервере, так и в ответе, возвращаемом обратно клиенту. В обоих случаях «result» сохраняет исходное значение «UNINITIALIZED».

Заранее спасибо!

1 Ответ

1 голос
/ 06 мая 2019

Вы можете просто добавить следующий параметр в функцию exec:

exec(data, globals())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...