МИНИМАЛЬНЫЙ ПРИМЕР
Поместите печать в функцию 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 пустое.
Я ожидал, что он распечатает все сохраненные значения, как в предыдущих двух функциях.
Чтоя делаю не так?