Почему мой скрипт на python часто завершается при использовании подпроцесса? - PullRequest
1 голос
/ 12 марта 2019

У меня есть этот код.В основном я использовал подпроцесс для выполнения программы несколько раз в цикле while.Он работает нормально, но через несколько раз (если быть точным 5 раз) мой скрипт на python просто завершается, и ему все еще предстоит пройти долгий путь до завершения.

        while x < 50:

            # ///////////I am doing things here/////////////////////

            cmdline = 'gmx mdrun -ntomp 1 -v -deffnm my_sim'
            args = shlex.split(cmdline)
            proc = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
            output = proc.communicate()[0].decode()

            # ///////////I am doing things here/////////////////////
            x += 1

Каждый раз, когда я вызываю программу, она будетпримерно один час, чтобы закончить.В то же время подпроцесс должен ждать, потому что в зависимости от выходных данных я должен выполнять части своего кода (поэтому я использую .communicate ()).

Почему это происходит?

Спасибоза помощь в продвинутом!

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Подпроцесс выполняется асинхронно в фоновом режиме (поскольку это другой процесс), и вам нужно использовать subprocess.wait () , чтобы дождаться его завершения.Поскольку у вас есть несколько подпроцессов, вы, вероятно, захотите подождать на всех из них, например:

exit_codes = [p.wait() for p in (p1, p2)]
0 голосов
/ 12 марта 2019

Чтобы решить эту проблему, я предлагаю сделать следующее:

    while x < 50:

        # ///////////I am doing things here/////////////////////

        cmdline = 'gmx mdrun -ntomp 1 -v -deffnm my_sim 2>&1 | tee output.txt'
        proc = subprocess.check_output(args, shell=True)
        with open('output.txt', 'r') as fin:
        out_file = fin.read()

        # ///////////Do what ever you need with the out_file/////////////   


        # ///////////I am doing things here/////////////////////
        x += 1

Я знаю, что не рекомендуется использовать shell = True, поэтому, если вы не хотите его использовать, просто передайте cmdline запятыми. Имейте в виду, что при переходе с запятыми вы можете получить ошибку. Я хочу вдаваться в подробности, но в этом случае вы можете использовать shell = True, и ваша проблема исчезнет.

Используя фрагмент кода, который я только что предоставил, ваш скрипт на python не завершится внезапно при многократном использовании подпроцесса и с программами, которые имеют много сообщений stdout и stderr.

Когда-нибудь это понадобится, и я надеюсь, что смогу помочь кому-то там.

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