Выполнить функции удаленно с python 3 - PullRequest
0 голосов
/ 22 апреля 2020

Я довольно новичок в python, и у меня была идея сценария: у вас есть слушатель, который ожидает функции, и клиентский сценарий, который отправляет инструкции на сервер, и в этом случае инструкции являются функциями. Например, я мог выполнять код функции из клиента на другом компьютере, который я пробовал использовать pickle, но я не могу понять, работает ли он с функциями

Должен ли я использовать сокеты или что-то еще?

здесь это код сервера:

    import socket
    import time


    HEADER_LENGHT = 10
    IP = socket.gethostname()
    PORT = 1234

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((IP, PORT))
    s.listen(5)

    while True:
        clientsocket, address = s.accept()
        print(f"Connection from {address} has been established ! ")

    while True:
        full_msg = b''
        new_msg = True
        while True:
            msg = s.recv(16)
            if new_msg:
                print(f"New message lenght: {msg[:HEADERSIZE]}")
                msglen = int(msg[:HEADERSIZE])
                new_msg = False

            full_msg += msg

            if len(full_msg)- HEADERSIZE == msglen:
                print("full msg recvd")
                print(full_msg[HEADERSIZE:])

                d = pickle.loads(full_msg[HEADERSIZE:])
                print(d)
                new_msg = True
                full_msg = b''

        print(full_msg)

Код клиента:


    import socket

    HEADERSIZE = 10

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

    while True:
        full_msg = b''
        new_msg = True
        while True:
            msg = s.recv(16)
            if new_msg:
                print(f"New message lenght: {msg[:HEADERSIZE]}")
                msglen = int(msg[:HEADERSIZE])
                new_msg = False

            full_msg += msg.decode("utf-8")

            if len(full_msg)- HEADERSIZE == msglen:
                print("full msg recvd")
                print(full_msg[HEADERSIZE:])
                new_msg = True
                full_msg = b''

        print(full_msg)

Вот код функции:

def generate(target, apikey, nbfriendly, nbteacher, nbleader, accounts):
    acc_list = accounts
    jsonFile = open("config.json", "r")
    data = json.load(jsonFile)
    lines_count = 0
    if nbfriendly == "":
        nbfriendly = 10
    if nbteacher == "":
        nbteacher = 10
    if nbleader == "":
        nbleader = 10
    if apikey == "":
        apikey = (data['steamWebAPIKey'])
    if target == "":
        target = (data['target'])
    for l in accounts:
        lines_count = lines_count + 1
    conn = sqlite3.connect("accounts.sqlite")
    c = conn.cursor()
    max = accounts.count("\n")
    counter = 0
    print(accounts)
    accounts = accounts.replace(":", " ")
    accounts = accounts.replace("\n", " ")
    accounts.split()
    print(accounts)
    splitted = accounts.split()
    while counter < max:
        username = splitted[counter]
        password = splitted[(counter + 1)]
        c.execute(
            "INSERT INTO accounts (username, password, sharedSecret, lastCommend, operational) VALUES (? , ?, ?, ? , ?)",
            (username, password, blank, mone, one)
        )
        conn.commit()
        counter += 2
    nbfriendly = int(nbfriendly)
    nbteacher = int(nbteacher)
    nbleader = int(nbleader)
    target = str(target)
    (data['commend']['friendly']) = nbfriendly
    (data['commend']['teaching']) = nbteacher
    (data['commend']['leader']) = nbleader
    (data['target']) = target
    (data['steamWebAPIKey']) = apikey
    data = json.dumps(data, indent=4)
    jsonFile.close()
    with open('config.json', 'w') as outfile:
        outfile.write(data)
        outfile.close()

1 Ответ

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

Я не уверен, что ваш код для отправки сообщений с использованием сокета правильный (я не вижу, куда вы отправляете байты).

Относительно pickle действительно возможно использовать его как функция. Кроме того, хорошо, что он сбрасывается как bytes объект, поэтому вам даже не нужно приводить его перед отправкой с sockets.

На стороне клиента:

import pickle

def f(n):
    return n * f(n - 1) if n else 1

to_send = pickle.dumps(f)

# Send to_send using sockets then

Затем, на стороне сервера, единственное, что вам нужно, это загрузить функцию:

import pickle

f = pickle.loads(received)

Поскольку все является объектом в Python, вы можете использовать точно такой же метод для отправьте аргументы функции, используя sockets и pickle.

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