Subprocess создает дочерний процесс, но не запускает скрипт

Рейтинг: 0Ответов: 1Опубликовано: 27.06.2023

Есть сокет-сервер, исправно работающий, попросили сделать к нему минимальные интерфейс, сделал с помощью PyQt5 в нем есть 2 кнопки: Запуск сервера и Выключения сервера, реализованы через subprocess следующим образом:

Запуск:

def start_serv(self):
    self.process = subprocess.Popen('python server.py', shell=True)
    logging.info('#' * 80)
    logging.debug(f'Process PID: {self.process.pid}')
    logging.debug(f'Child process return code: {self.process.returncode}')
    self.mb('The server is running!') # отправка сообщения в диалоговое окно

Выключение:

def stop_serv(self):
    try:
        proc = self.process
        proc.send_signal(signal.SIGTERM)
        while True:
            ex_code = proc.poll()
            if ex_code == None or ex_code == '1':
                proc.wait()
                continue
            else:
                break
        logging.debug(f'Child process exit code: {proc.poll()}')
        logging.debug('The server is stopped!')
        logging.info('#' * 80)
        self.mb('The server is stopped!') # отправка сообщения в диалоговое окно
    except Exception as e:
        logging.warning(f'Error button: {e}')
        self.mb('The server is not running yet!') # отправка сообщения в диалоговое окно

В IDE(PyCharm) все работает отлично. Но после сборки с помощью auto-py-to-exe при нажатии на кнопку запуска создается процесс с новым PID, но сервер не стартует. Пути к файлам во время сборки не изменялись.

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

P.S.: Все делается на Python 3.8.2 под RED OS (привет импортозамещение).

Ответы

▲ 0

'python server.py' - рекомендую использовать полный путь к питону и к запускаемому файлу.

python_path = sys.executable

server_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),"server.py")

также может не попасть рабочая папка проекта в cwd при запуске

cwd=os.path.dirname(os.path.abspath(__file__))
... Popen(...., cwd=cwd)