Как я могу избежать зависания Python на subprocess.run () - PullRequest
0 голосов
/ 11 февраля 2020

Я создаю небольшой скрипт автоматизации для взаимодействия с игрой. Игра очень уязвима к сбоям, но непредсказуемо (от 30 минут до 3 часов, в зависимости от того, что происходит в игре). Из-за этого ниже я написал небольшой скрипт, который ИДЕАЛЬНО собирался убить программу, убить клиента мониторинга cra sh, который проверяет наличие сбоев и предлагает перезапустить, а затем перезапустить игру и возобновить. Проблема в том, что я никогда не доходил до subprocess.run ()

, он снова запускает игру, но не позволяет запустить какой-либо код после этого.

import psutil
import time
import subprocess

def main():
    '''Process kill function'''    
    for proc in psutil.process_iter():
        # check whether the process name matches
        # print(proc.name())
        if any(procstr in proc.name() for procstr in\
            ['GameName.exe']):
            print(f'Killing {proc.name()}')
            proc.kill()
            time.sleep(5)
    for proc in psutil.process_iter():
        # check whether the process name matches
        # print(proc.name())
        if any(procstr in proc.name() for procstr in\
            ['GameCrashMonitor.exe']):
            print(f'Killing {proc.name()}')
            proc.kill()
    time.sleep(10)
    subprocess.run(r'PathToGame.exe')
    print(time.time())

if __name__ == "__main__":
    main()

Эта программа успешно попадает в subprocess.call, снова запускает игру, а затем python зависает. Я не могу контролировать c на i python, чтобы остановить его. Я использую Spyder, и он даже делает значок spyder на моей панели задач ошибочным и исчезает.

1 Ответ

0 голосов
/ 11 февраля 2020

Попробуйте заменить subprocess.run() на variable = subprocess.Popen([r'PathToGame.exe']) https://docs.python.org/3/library/subprocess.html говорит, что subprocess.run () ожидает завершения команды, а затем возвращает экземпляр CompletedProcess. Ваша команда не завершена. Кроме того, есть аргумент времени ожидания, который вы можете передать в run (), но по умолчанию он равен None и не истекает, если вы все еще хотите использовать .run()

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