Словарь возвращает разные значения при доступе из разных функций - PullRequest
1 голос
/ 10 мая 2019

МИНИМАЛЬНЫЙ ПРИМЕР

Поместите печать в функцию get_tuple_space:

def get_tuple_space():
    global tuple_space
    print("VALUE INSIDE GETTER")
    print(tuple_space)
    return tuple_space

Когда я вызываю эту функцию внутри файла server.py, где объявляется tuple_spaceОпределено, что я получаю ожидаемый результат, то есть пространство tuple_space, заполненное некоторыми элементами.

while True:
        # Get the list sockets which are ready to be read through select
        readable,writable,exceptional = select.select(connected_list,[],[])

        for sock in readable:
            #New connection
            if sock == server_socket:
                connect()

            #Some incoming message from a client
            else:
                handle_incoming_msg(sock)
                print("Trying to get tuple space inside server")
                print(get_tuple_space())

Однако, попытка вызвать эту функцию в моем client.py, как показано ниже, дает мне пустой словарь:

import socket, select, string, sys
import server

#some code
#...
#...

while True:
        socket_list = [sys.stdin, client_socket]

        # Get the list of sockets which are readable
        rList, wList, error_list = select.select(socket_list , [], [])

        for sock in rList:
            #user entered a message
            msg=sys.stdin.readline()
            linda.blog_out(my_name, my_topic, msg, client_socket)

            #HERE
            print("trying to get tuple space inside client")
            print(server.get_tuple_space())

            #reads from topic
            messages = linda.blog_rd(my_topic)
            print messages

КОНЕЦ МИНИМАЛЬНОГО ПРИМЕРА

ОБНОВЛЕНИЕ

Добавлен «глобальный tuple_space» в функции, которые используют этот словарь.Кроме того, я попытался вызвать get_tuple_space внутри моего серверного кода, и он вернул правильное значение.Похоже, проблема возникает, когда я вызываю функцию из другого кода.

END OF UPDATE

У меня, вероятно, очень начальная проблема с Python.Я пытаюсь сделать некоторый код, используя сокеты и словари, но, как ни странно, мой dict возвращает заполненные в некоторых функциях и пустые в других функциях.Я сделал его глобальным, так что я ожидал, что он вернется ко всем моим функциям.

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

Во-первых, мой словарь инициализируется в server.py следующим образом

tuple_space={}

После этого, например, первая функция подключаетсяклиент к сокету сервера и получает сообщение, содержащее его имя, интересующую тему и написанное сообщение.Затем моя программа обновляет словарь de tuple_space некоторой информацией.Вторая функция делает очень похожую вещь, обновляя словарь tuple_space новыми сообщениями от этого клиента об этой теме.

Оба возвращают самую последнюю версию моего словаря и работают в коде моего сервера.

def connect():

    sockfd, addr = server_socket.accept()

    data =str(sockfd.recv(buffer))
    name, topic, msg = data.split("@")

    connected_list.append(sockfd)
    tuple_space[(name, topic)]=""

    #add name and address
    registered_names.append(name)

    tuple_space[(name,topic)] = msg


def handle_incoming_msg(sock):
    # Data from client
    data = sock.recv(buffer)

    name, topic, msg = data.split("@")

    tuple_space[(name, topic)] = msg

    print(tuple_space)

Обе функции используются в моем главном внутри server.py.Первый, когда новый клиент подключается и отправляет свое имя, тему и сообщение, второй, когда клиент подключает что-то:

def main():
    server_socket.bind((host, port))
    server_socket.listen(10) #listen atmost 10 connection at one time

    # Add server socket to the list of readable connections
    connected_list.append(server_socket)
    print("Servidor inicializado\n")

    while True:
        # Get the list sockets which are ready to be read through select
        readable,writable,exceptional = select.select(connected_list,[],[])

        for sock in readable:
            #New connection
            if sock == server_socket:
                connect()

            #Some incoming message from a client
            else:
                handle_incoming_msg(sock)

    server_socket.close()

После этого я хочу получать последние сообщения, хранящиеся в tuple_spaceв моем коде client.py.Вот что я делаю внутри цикла в моем клиенте:

messages_list = linda.blog_rd(my_topic)
            if len(messages_list)>0:
                print(messages_list)

Функция blog_rd является следующей, определенной в моем классе "Линда"

def blog_rd(self, topic):

        incoming_messages = []

        registered_names = get_registered_names()
        tuple_space = get_tuple_space()

        for i in range(len(registered_names)):
            name = registered_names[i]
            print(name)
            incoming_messages.append((name, tuple_space[(name,topic)]))

        return incoming_messages

Она была предложенаполучить зарегистрированные имена и получить сообщения, хранящиеся в tuple_space, которые вызывают функцию get_tuple_space.

Проблема начинается здесь:

def get_tuple_space():
    print(tuple_space)
    return tuple_space

Когда я вызываю эту функцию, глобальный словарь tuple_space возвращает пустое значение.Это также происходит со списком зарегистрированных имен.Я создал этот пост о словаре, чтобы упростить мое объяснение, так как ошибка в зарегистрированных именах такая же, как и в tuple_space.

В моем проекте эта функция вызывается в другом файле кода, доступ к которому осуществляется посредством импортаserver.py.Но что меня смущает, так это то, что даже в распечатке пространство tuple_space пустое.

Я ожидал, что он распечатает все сохраненные значения, как в предыдущих двух функциях.

Чтоя делаю не так?

Ответы [ 2 ]

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

Насколько я понимаю, tuple_space объявлен в файле и используется в одном или нескольких других. Но все переменные в Python заключены в пространство имен их модуля (файл, в котором он создан). Поэтому, если tuple_space объявлено в server.py, вы должны импортировать его в другой файл с from server import tuple_space.

0 голосов
/ 13 мая 2019

спасибо всем, кто пытался помочь.

Как я уже сказал, у меня возникли проблемы с приведением минимального примера, так как в моем минимальном примере без сокетов он работал с вашими предложениями, но не работал вРеальный проект.

Что я сделал, чтобы решить, так это изменил способ представления tuple_space.Я сделал это классом с необходимыми атрибутами, которые раньше были в словаре.Таким образом, server.py использует объект и обрабатывает его в зависимости от сообщений, отправленных с сервера.

Не уверен, что происходило раньше, но я рад, что каким-то образом решил проблему.

Спасибо!

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