чтение из stdin вешает wx.FileDialog().ShowModal
Пишу GUI приложение, которое запускается как подпроцесс, и управляется потоком из stdin.
Внезапно выяснилось, что wx.FileDialog().ShowModal() зависает, если в соседнем потоке что-то читается из stdin.
Выделил минимальный код:
python -c "while 1: __import__('time').sleep(0.1); print 'a'" | python editor_satellite.py
файл editor_satellite.py:
Надпись "i'm here (1)" выводится, а "i'm here (2)" - уже нет.
Куда копать? Что это вообще может быть? Как вылечить/захакать?
Дело происходит под Windows, но не знаю влияет ли это.
upd:
Так тоже виснет:
python -c "import time; time.sleep(10000)" | python editor_satellite.py
Вот так - нет, хотя в теории тоже самое:
python editor_satellite.py
Почему-то важно, что это пайп.
upd:
Пока что сделал левой ногой через правое ухо, запустил окошко выбора файла в другом процессе, что бы оно просто его распечатывало, и return subprocess.Popen(cmd, stdin = PIPE, stdout = PIPE, stderr = PIPE).communicate()[0].strip()
Внезапно выяснилось, что wx.FileDialog().ShowModal() зависает, если в соседнем потоке что-то читается из stdin.
Выделил минимальный код:
python -c "while 1: __import__('time').sleep(0.1); print 'a'" | python editor_satellite.py
файл editor_satellite.py:
import sys, wx, threading app = wx.App() def InputThread(): while 1: c = sys.stdin.read(1) stdin_thread = threading.Thread(target = InputThread) stdin_thread.start() dlg = wx.FileDialog(None, message="open file", defaultDir = "", wildcard="(*.*)|*.*", style = 0) print "i'm here (1)" if wx.ID_OK == dlg.ShowModal(): print "i'm here (2)" print >> sys.stderr, dlg.GetFilename()
Надпись "i'm here (1)" выводится, а "i'm here (2)" - уже нет.
Куда копать? Что это вообще может быть? Как вылечить/захакать?
Дело происходит под Windows, но не знаю влияет ли это.
upd:
Так тоже виснет:
python -c "import time; time.sleep(10000)" | python editor_satellite.py
Вот так - нет, хотя в теории тоже самое:
python editor_satellite.py
Почему-то важно, что это пайп.
upd:
Пока что сделал левой ногой через правое ухо, запустил окошко выбора файла в другом процессе, что бы оно просто его распечатывало, и return subprocess.Popen(cmd, stdin = PIPE, stdout = PIPE, stderr = PIPE).communicate()[0].strip()
