Форум сайта python.su
Есть 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()
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--')
Отредактировано vfs (Фев. 2, 2021 11:53:29)
Офлайн
vfsЧем “компилируете”?
Если не компилировать и запускать tested.py - то все прекрасно ловиться и работает, НО
[code python][/code]
Офлайн
PEHDOMpyinstaller
Отредактировано vfs (Фев. 2, 2021 14:43:43)
Офлайн
vfsЭтот бы инсталлер поперек оси очка засунуть его изобретателю. Это гавно, не надо его использовать. По всем вопросам касательно pyinstaller обращайтесь к автору pyinstaller-а, пусть он несет за это персональную ответственность. Форум о питоне, а не о странных вещах, которые чьё-то мутное сознание родило под спидами.
pyinstaller
Офлайн
А другой вариант передать вывод с подпроцесса существует или только что-то суперсложное типа записать процессом в переменную и обменяться памятью через мультипроцессинг?
Офлайн
FishHook
vfs
pyinstaller
Этот бы инсталлер поперек оси очка засунуть его изобретателю. Это гавно, не надо его использовать. По всем вопросам касательно pyinstaller обращайтесь к автору pyinstaller-а, пусть он несет за это персональную ответственность. Форум о питоне, а не о странных вещах, которые чьё-то мутное сознание родило под спидами.
Офлайн
vfsВ таком случае оно у вас работать не будет, по крайней мере так как вы хотите. Дело в том что пайинсталлер не компилирует, он просто упаковывает пайтон и ваш скрипт в SFX архив(там чуть посложнее но общий принцип именно такой), и когда вы запускаете вашу “скомпилированую” программу, вы запускаете SFX модуль, он распаковывает в TEMP пайтон, и спаунит еще пару процессов, вот в одном из них и выполняется ваш скрипт. Принты то он пуляет в стдоут, но ваш скрипт то слушает стдоут совсем другого процесса.
pyinstaller
[code python][/code]
Отредактировано PEHDOM (Фев. 2, 2021 16:07:33)
Офлайн
FishHook
vfs
pyinstaller
Этот бы инсталлер поперек оси очка засунуть его изобретателю. Это гавно, не надо его использовать. По всем вопросам касательно pyinstaller обращайтесь к автору pyinstaller-а, пусть он несет за это персональную ответственность. Форум о питоне, а не о странных вещах, которые чьё-то мутное сознание родило под спидами.
PEHDOM
В таком случае оно у вас работать не будет, по крайней мере так как вы хотите. Дело в том что пайинсталлер не компилирует, он просто упаковывает пайтон и ваш скрипт в SFX архив(там чуть посложнее но общий принцип именно такой), и когда вы запускаете вашу “скомпилированую” программу, вы запускаете SFX модуль, он распаковывает в TEMP пайтон, и спаунит еще пару процессов, вот в одном из них и выполняется ваш скрипт. Принты то он пуляет в стдоут, но ваш скрипт то слушает стдоут совсем другого процесса.
Вобщем в таком случае вам нужно одно из:
- отказаться от “компиляции” пайинсталлером
- искать “нужный” процесс и пробовать прицепиться к нему
- попробовать, например Nuitka, она не упаковывает как пайинсталлер или схФризи, а транслирует код Python в код на Cи/C++ а потом уже его компилирует. Но там могут быть свои заморочки.
Офлайн
Нашел рабочий вариант через сокеты, только не понимаю как получаешь в них данные
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)
Офлайн
vfsНУ я сразу сказал что там могут быть свои заморочки.
nuitka пробовал тоже самое
vfsну тут разные варианты, можно увеличить максимальное значение буфера в recv(). Если вы заранее знаете что например длиннее 4096 данных не может прийти то ставте это значение. Можно из кусочков склеивать. Можно вызывать recv() без параметров, тогда оно будет возвращать данные всякий раз, когда чтото получает. Но тогда нужно подумать как определить что отправитель завершил отправку.
но вот что будет если отправилось больше 1024, поток данных - это список делают и собирают кусочки или там другая система?
[code python][/code]
Офлайн