Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 2, 2021 11:52:29

vfs
Зарегистрирован: 2021-01-13
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Как прочитать вывод подпроцесса exe (PIPE не помогает)

Есть 2 скрипта на exe,

1 - лаунчер:

 import os, sys
from subprocess import PIPE, Popen
from pyautogui import alert
process = Popen(['tested.exe'], stdout=PIPE, stderr=PIPE)
while process.poll() is None:
    output_line = process.stdout.readline()
    print(output_line.decode()[:-2]) #обрезаем \r\n
    if output_line.decode()[:-2] == 'exit':
        alert('Прервано пользователем', 'Прервано!', 'Выход')
        process.kill()
        sys.exit()

2 - tested скрипт
 from pynput import keyboard
from time import sleep
import os
import psutil
def event():
    current_system_pid = os.getpid()
    ThisSystem = psutil.Process(current_system_pid)
    print('exit') #этот вывод хочу ловить родителем
    ThisSystem.terminate()
listener = keyboard.GlobalHotKeys({'<ctrl>+q': event}) #асинхронно слушаем клавиатуру
listener.start()
while 1:
    sleep(1)
    print('--waited--')

Как мне словить текстовый вывод с event?
Если не компилировать и запускать tested.py - то все прекрасно ловиться и работает, НО
Если tested.exe - тишина, куда он делает принты непонятно…в черную дыру может какую..
измучился, изгуглился, без понятия почему так и какой нормальный вариант решения, только простым языком пожалуйста, новичок в этом.

Отредактировано vfs (Фев. 2, 2021 11:53:29)

Офлайн

#2 Фев. 2, 2021 13:46:17

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Как прочитать вывод подпроцесса exe (PIPE не помогает)

vfs
Если не компилировать и запускать tested.py - то все прекрасно ловиться и работает, НО
Чем “компилируете”?



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#3 Фев. 2, 2021 14:42:48

vfs
Зарегистрирован: 2021-01-13
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Как прочитать вывод подпроцесса exe (PIPE не помогает)

PEHDOM
pyinstaller

Отредактировано vfs (Фев. 2, 2021 14:43:43)

Офлайн

#4 Фев. 2, 2021 14:47:05

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как прочитать вывод подпроцесса exe (PIPE не помогает)


vfs
pyinstaller
Этот бы инсталлер поперек оси очка засунуть его изобретателю. Это гавно, не надо его использовать. По всем вопросам касательно pyinstaller обращайтесь к автору pyinstaller-а, пусть он несет за это персональную ответственность. Форум о питоне, а не о странных вещах, которые чьё-то мутное сознание родило под спидами.



Офлайн

#5 Фев. 2, 2021 15:00:23

vfs
Зарегистрирован: 2021-01-13
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Как прочитать вывод подпроцесса exe (PIPE не помогает)

А другой вариант передать вывод с подпроцесса существует или только что-то суперсложное типа записать процессом в переменную и обменяться памятью через мультипроцессинг?

Офлайн

#6 Фев. 2, 2021 15:02:06

vfs
Зарегистрирован: 2021-01-13
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Как прочитать вывод подпроцесса exe (PIPE не помогает)

FishHook
vfs
pyinstaller

Этот бы инсталлер поперек оси очка засунуть его изобретателю. Это гавно, не надо его использовать. По всем вопросам касательно pyinstaller обращайтесь к автору pyinstaller-а, пусть он несет за это персональную ответственность. Форум о питоне, а не о странных вещах, которые чьё-то мутное сознание родило под спидами.


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

Офлайн

#7 Фев. 2, 2021 16:06:33

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Как прочитать вывод подпроцесса exe (PIPE не помогает)

vfs
pyinstaller
В таком случае оно у вас работать не будет, по крайней мере так как вы хотите. Дело в том что пайинсталлер не компилирует, он просто упаковывает пайтон и ваш скрипт в SFX архив(там чуть посложнее но общий принцип именно такой), и когда вы запускаете вашу “скомпилированую” программу, вы запускаете SFX модуль, он распаковывает в TEMP пайтон, и спаунит еще пару процессов, вот в одном из них и выполняется ваш скрипт. Принты то он пуляет в стдоут, но ваш скрипт то слушает стдоут совсем другого процесса.
Вобщем в таком случае вам нужно одно из:
- отказаться от “компиляции” пайинсталлером
- искать “нужный” процесс и пробовать прицепиться к нему
- попробовать, например Nuitka, она не упаковывает как пайинсталлер или схФризи, а транслирует код Python в код на Cи/C++ а потом уже его компилирует. Но там могут быть свои заморочки.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Фев. 2, 2021 16:07:33)

Офлайн

#8 Фев. 3, 2021 08:45:55

vfs
Зарегистрирован: 2021-01-13
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Как прочитать вывод подпроцесса exe (PIPE не помогает)

FishHook
vfs
pyinstaller

Этот бы инсталлер поперек оси очка засунуть его изобретателю. Это гавно, не надо его использовать. По всем вопросам касательно pyinstaller обращайтесь к автору pyinstaller-а, пусть он несет за это персональную ответственность. Форум о питоне, а не о странных вещах, которые чьё-то мутное сознание родило под спидами.


Да вот когда не останется вариантов перейду на embded питон, заодно и с импортами проблемы исчезнут.
PEHDOM
В таком случае оно у вас работать не будет, по крайней мере так как вы хотите. Дело в том что пайинсталлер не компилирует, он просто упаковывает пайтон и ваш скрипт в SFX архив(там чуть посложнее но общий принцип именно такой), и когда вы запускаете вашу “скомпилированую” программу, вы запускаете SFX модуль, он распаковывает в TEMP пайтон, и спаунит еще пару процессов, вот в одном из них и выполняется ваш скрипт. Принты то он пуляет в стдоут, но ваш скрипт то слушает стдоут совсем другого процесса.
Вобщем в таком случае вам нужно одно из:
- отказаться от “компиляции” пайинсталлером
- искать “нужный” процесс и пробовать прицепиться к нему
- попробовать, например Nuitka, она не упаковывает как пайинсталлер или схФризи, а транслирует код Python в код на Cи/C++ а потом уже его компилирует. Но там могут быть свои заморочки.


nuitka пробовал тоже самое

Офлайн

#9 Фев. 3, 2021 08:50:59

vfs
Зарегистрирован: 2021-01-13
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Как прочитать вывод подпроцесса exe (PIPE не помогает)

Нашел рабочий вариант через сокеты, только не понимаю как получаешь в них данные

 HOST = ''
PORT = 50007
with socket.socket() as s:
    s.bind((HOST, PORT))
    s.listen(1)
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024)
            if not data: break
            #conn.sendall(data)
        print(data)

Вот образец с доков, я так понимаю получаешь тут по 1024 или сколько надо, но вот что будет если отправилось больше 1024, поток данных - это список делают и собирают кусочки или там другая система?

Офлайн

#10 Фев. 3, 2021 11:27:48

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Как прочитать вывод подпроцесса exe (PIPE не помогает)

vfs
nuitka пробовал тоже самое
НУ я сразу сказал что там могут быть свои заморочки.
vfs
но вот что будет если отправилось больше 1024, поток данных - это список делают и собирают кусочки или там другая система?
ну тут разные варианты, можно увеличить максимальное значение буфера в recv(). Если вы заранее знаете что например длиннее 4096 данных не может прийти то ставте это значение. Можно из кусочков склеивать. Можно вызывать recv() без параметров, тогда оно будет возвращать данные всякий раз, когда чтото получает. Но тогда нужно подумать как определить что отправитель завершил отправку.
Вобщем там тоже не все так просто, нужно изучать как работают сокеты и сетевые протоколы.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version