Python не извлекает стандартный вывод из файла Popen exe подпроцесса - PullRequest
0 голосов
/ 24 марта 2020

Я знаю, что есть много подобных вопросов, но я действительно не могу понять, что я делаю неправильно. Я пытаюсь выполнить sh: чтение stdout из файла .exe, предварительно скомпилированного из .py.

Это основная программа для выполнения подпроцесс

from subprocess import Popen, PIPE, STDOUT


runcloud = Popen([r'demo2.exe'], stdout=PIPE)
with runcloud.stdout:
    for line in iter(runcloud.stdout.readline, b''):
        print(line)  ##PRINTS NOTHING ??

И это файл .exe перед компиляцией (demo2.exe)

import os

try:
    print('RESPONSE')
except:
    print('no connection')

os._exit(0)

Для некоторых реализаций мне нужно скомпилировать demo2 и добавьте последнюю строку os._exit(). Этот .exe файл при запуске в cmd показывает строку печати. Но не удается распечатать из основной программы, используя subprocess


EDIT: После некоторых комментариев я запустил код без компиляции файла и добавления ключевого слова python и до сих пор ничего не печатает. Комментарий: Даже если я позволю ему работать с файлом py или просто удалю os._exit(0), он все равно ничего не печатает, обратите внимание, что в моем каталоге нет другого файла с аналогичным именем.


РЕДАКТИРОВАТЬ - ВРЕМЕННОЕ РЕШЕНИЕ: После нескольких часов поиска решения, единственным обходным решением было написание кода внутри файла exe, который сохраняет (я не думаю, что могу назвать это «перенаправлением») выводится в другом файле, например .txt, или в базу данных с простой настройкой, например SQlite, затем в основной программе вызывается Popen, чтобы выполнить exe с .wait() и завершить считывание записанных значений в файле. или база данных. Поскольку я не выяснил, почему Popen не захватывает функции print в stdout, и обходной путь можно найти уже в других вопросах, я пока оставлю этот вопрос открытым.

1 Ответ

0 голосов
/ 24 марта 2020

Во-первых, вы должны указать путь к demo2.exe, т.е. ваша строка должна быть r'./demo2.exe', если исполняемый файл находится в том же каталоге, что и основная программа (или полный путь, если это не так). Затем попробуйте удалить вызов os._exit (0) из файла demo2. Вы также можете попробовать использовать подпроцесс check_output для этого типа вызова, он немного упрощает код:

from subprocess import check_output

output = check_output([r'./demo2'])
print(output)
...