Как передать переменную (строку) из запущенного серверного скрипта в другой файл python? - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть клиент python и сервер python и команды, которые работают отлично. Теперь я хочу создать интерфейс, которому нужна переменная (строка) из файла сервера, и я столкнулся с проблемой.

мой файл client.py

import socket

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(),1234))

s.send(bytes("command1","utf-8"))

мой файл server.py:

import socket

while (1):
    s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((socket.gethostname(),1234))
    s.listen(5)
    clientsocket, address=s.accept()
    msg=clientsocket.recv(1024)
    message=msg.decode("utf-8") # I need to pass this to the other file
    print(message)

файл, в который мне нужно импортировать строку сообщения из файла server.py:

    from tkinter import *
    from server import message


    def function():
        #do some stuff


    Menu_Win = Tk()

    photo = PhotoImage(file=r"path_to_local_file.png")

    Background_Main = Canvas(Menu_Win, width=1980, height=1080, bg="white")
    Background_Main.pack()

    Background_Main.create_image(0,80, image=photo, anchor='nw')

    if message=="command1": #this would be the variable from the server file
        function()


    Menu_Win.mainloop()


I tried to use **from server import message** but it gives me this error **OSError: [WinError 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted** and I found out that it gives me this error only when I am continuously running the server.py file and I thinking that the second files when imports, it imports the socket too.

UPDATE1: deleted


UPDATE2: deleted 

UPDATE3:

I have found myself a solution, by using threading library and running the echoing server on a thread and the rest of the code (GUI) on another.

import socket
from tkinter import*
import threading

message="dummy variable"

def test_button():
    print(message)

root=Tk()
Canvas(root, width=300, height=100).pack()
Button(root,text=("Server"), command=test_button).pack()

def get_command():
    while 1:
        global message
        s=socket.socket()
        s.bind((socket.gethostname(),1234))
        s.listen(5)
        clientsocket, address=s.accept()
        msg=clientsocket.recv(1024)
        message=msg.decode("utf-8")

t = threading.Thread(target=get_command)
t.start()

def my_mainloop(): #to actually see if the command is updated in real time
    print(message)
    root.after(1000, my_mainloop)    

root.after(1000, my_mainloop)

root.mainloop()  

Спасибо за всю поддержку:)

Ответы [ 3 ]

0 голосов
/ 20 апреля 2020
while True:
    message = server.get_string()

    if message=="comand1":
        function1()

    if message=="comand2":
        function2()

И вместо использования Main_Win.mainloop() вы должны поместить Main_Win.update() до того, как l oop:

Main_Win.update()

while True:
    message = server.get_string()

    if message=="comand1":
        function1()

    if message=="comand2":
        function2()
    Main_Win.update()
0 голосов
/ 20 апреля 2020

Мне очень нравится эта библиотека. Ссылка содержит полный пример, который, я думаю, применим почти непосредственно к вашему коду.

Недостатком является то, что вам не нужно использовать другой порт для такого рода связи или добавить опцию reuse_address в сокет, который вы используете. в настоящее время используется.

0 голосов
/ 20 апреля 2020

Вы можете определить функцию в server.py:

import socket

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(),1234))
s.listen(5)
clientsocket, address=s.accept()

def get_string():
    msg=clientsocket.recv(1024)
    message=msg.decode("utf-8") # I need to pass this to the other file
    return message

А затем в вашей другой программе импортировать server и вызвать функцию server.get_string():

from tkinter import *
import server


def function():
    #do some stuff


Menu_Win = Tk()

photo = PhotoImage(file=r"path_to_local_file.png")

Background_Main = Canvas(Menu_Win, width=1980, height=1080, bg="white")
Background_Main.pack()

Background_Main.create_image(0,80, image=photo, anchor='nw')

message = server.get_string()

if message=="abc": #this would be the variable from the server file
    function()


Menu_Win.mainloop()

Ps вы получаете ошибку из-за того, что вы не выключаете сервер после его запуска, затем вы пытаетесь снова запустить сервер на уже существующем сервере.

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