Image

Image_winnie wrote in Imageru_python

чтение из 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:
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()