Как запустить несколько команд через сокет Python - PullRequest
0 голосов
/ 09 мая 2019

У меня проблема с кодом, я хочу запускать команды на моих виртуальных машинах через сокеты. Я нашел проблему с несколькими задачами, командами. Например, если я открываю Excel, мой сервер сокетов был заморожен, и я не могу выполнить другую команду через cmd, прежде чем закрыть приложение Excel вручную.

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

Server.py

import socket
import subprocess
import os
from threading import Thread


def check_ping(hostname):
    response = os.system("ping " + hostname)
    # and then check the response...
    if response == 0:
        pingstatus = "Network Active"
    else:
        pingstatus = "Network Error"

    return(pingstatus)

def run_path(path):
    response = os.system(path)
    # and then check the response..
    return('ok')



def Main():
    host = "localhost"
    port = 5000

    mySocket = socket.socket()
    mySocket.bind((host,port))

    mySocket.listen(1)
    conn, addr = mySocket.accept()
    print ("Connection from: " + str(addr))
    while True:
            data = conn.recv(1024).decode()
            if not data:
                    break
            #print ("from connected  user: " + str(data))

            #data = str(data)
            #hostname = data.replace('ping ', '')

            print ("sending: " + str(data))
            #print(hostname)
            conn.send(data.encode())
            if 'ping' in str(data):
                hostname = data.replace('ping ', '')
                pingstatus = check_ping(hostname)
                print(pingstatus)
            elif 'open' in str(data):
                path = str(data).replace('open ', '')

                run_path(path)





    conn.close()

if __name__ == '__main__':
    Main()

Client.py

import socket

def Main():
        host = '127.0.0.1'
        port = 5000

        mySocket = socket.socket()
        mySocket.connect((host,port))

        message = input(" -> ")

        while message != 'q':
                mySocket.send(message.encode())
                data = mySocket.recv(1024).decode()

                print ('Received from server: ' + data)

                message = input(" -> ")

        mySocket.close()

if __name__ == '__main__':
    Main()

1 Ответ

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

Чтобы иметь возможность запустить новую команду до возвращения предыдущей, вам просто не нужно ждать этого события.Это означает, что вы должны использовать модуль подпроцесса вместо функции system:

def run_path(path):
    response = subprocess.Process(path, shell=True)
    # and then continue without waiting...
    return('ok')

Но на самом деле это не имеет смысла, если вы хотите что-то вернуть партнеру.Кроме того, на самом деле не имеет смысла запускать программу с графическим интерфейсом с удаленного клиента, не имея возможности управлять им или даже остановить его.

Боюсь, что вы гоняетесь за странным животным здесь ...

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