LINUX.ORG.RU

Как в Python мультиплексировать каналы?


0

0

Есть консольная программа, которая, как и полагается, в stdin принимает команды, в stdout пишет ответ, а в случае возникновения ошибки посылает её текст в stderr. Программа под оффтопиком. Пишу на Python к ней морду, но уткнулся в то, что select() работает под виндой только с сокетами.

Что же делать?

PS: Прошу не предлагать сменить язык, я как раз на данном примере изучаю Python.

По-моему, под виндой select в любом раскладе работает только с сокетами.
Вариант с потоками мне кажется почти единственным.

ShprotX
()
Ответ на: комментарий от ShprotX

> По-моему, под виндой select в любом раскладе работает только с сокетами.

Этого не может быть. WaitForMultipleObjects работает даже с дисковыми файлами.

tailgunner ★★★★★
()
Ответ на: комментарий от ShprotX

> а как ты отреагируешь на предложение сменить ось? да и версию питона на 3.0? вышел же final?

Ось сменить не получится, потому что пресловутая консольная программа - это шелл к специфичной железке, драйвер для которой есть только под винду. Ну а в Python 3.0 изменений по этой части я не нашел.

> http://www.python.org/doc/faq/library/#how-do-i-run-a-subprocess-with-pipes-c...

> Вообще, subprocess.py из любого нового Питона должен быть переносим.

Я и пользую subprocess.Popen().

onemore
() автор топика
Ответ на: комментарий от tailgunner

> Этого не может быть. WaitForMultipleObjects работает даже с дисковыми файлами.

откуда такая осведомлённость :-? может быть вы ещё и на виндузячие форумы захаживаете? под покровом ночи, пока никто не видит..

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от tailgunner

>> По-моему, под виндой select в любом раскладе работает только с сокетами.

> Этого не может быть. WaitForMultipleObjects работает даже с дисковыми файлами.

А *select* под виндой работает только с сокетами.

Deleted
()

В венде по нормальному это решить нельзя, только на потоках, даже в случае с C++ и boost::asio/libevent.

Reset ★★★★★
()
Ответ на: комментарий от Deleted

>>> По-моему, под виндой select в любом раскладе работает только с сокетами.

>> Этого не может быть. WaitForMultipleObjects работает даже с дисковыми файлами.

> А *select* под виндой работает только с сокетами.

Вызов вендовой libc select работает только с сокетами, возможно. Но речь о Питоне... но можно реализовать нормальный select (иоли даже poll), и кто-то наверняка это уже сделал.

И даже такой если реализации нет, можно дернуть через ctypes "родной" WaitForMultipleObjects.

tailgunner ★★★★★
()
Ответ на: комментарий от Reset

> В венде по нормальному это решить нельзя, только на потока

Почему не сработает WaitForMultipleObjects?

tailgunner ★★★★★
()
Ответ на: комментарий от klalafuda

>> Этого не может быть. WaitForMultipleObjects работает даже с дисковыми файлами.

> откуда такая осведомлённость :-?

Жизнь сложилась так, что пришлось поработать в нескольких ОС, и более менее теоретически изучить еще парочку %) Одной и парочки была NT. IIRC, даже файловые дескрипторы в NT могут быть в signaled state, на которое реагирует WFMO.

> может быть вы ещё и на виндузячие форумы захаживаете? под покровом ночи, пока никто не видит..

Раз в год на RSDN %) Но там обсуждают почти исключительно .Net, что не интересно вообще ни с какой стороны.

tailgunner ★★★★★
()
Ответ на: комментарий от teferiincub

> версию питона на 3.0?

Местами есть баги. Если хочется посмотреть то тягайте из транка :). 3.0 это первый публичный релиз и народные массы много багов ловят. Я вот несколько багрепортов по документации уже запостил :). Хотя, на несложных скриптах проблем больше года уже нет.

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.