2012-09-19 7 views
7
にselect.selectに

をsys.stdinをを使用して可能重複:UNIX上で
Can select() be used with files in Python under Windows?Windowsの

私はPythonでselect.selectsys.stdinを渡すことができています。私はWindowsでこれをやろうとしていますが、WindowsのPythonでselect.selectは許可しません。

私が行っていることをより正確に説明するには、https://github.com/eldarion/gondor-client/blob/ccbbf9d4b61ecbc2f66f510b993eb5fba0d81c09/gondor/run.pyを参照してください。

unix_run_poll機能は、私がWindowsで達成しようとしている機能です。基本的な考え方は、私はストリーミングstdin、stdout、stderrをリモートで実行しているプロセスに接続しているサーバーへのソケット接続があり、ローカルクライアントからそれとやりとりしているように見せかけることです。プロセス。

win32_run_pollは、Windowsに移植しようとしましたが、それはうまくいきます。それはちょっとばかげていて、IMOというアプローチは非常に悪いです。

これを改善する方法についての提案はありますか? win32apiへの依存性は理想的ではありませんが、私はそれを保つことで大丈夫です。

+1

イベントループの実装専用のライブラリ/フレームワークを見てきましたか?たとえば、[twisted](http://twistedmatrix.com/trac/)には[Win32 reactor]の2つの実装があります(http://twistedmatrix.com/documents/current/core/howto/choosing-reactor.html# win32_wfmo)。 – user4815162342

+0

面白いですね。私は今それをやっていた。 :-) –

+0

もう一つの可能​​性は、スクリプトのstdin/stdoutとしてラップするのではなく、実際にあなたのスクリプトにソケットを与えてから、select.selectを使うだけです。 – abarnert

答えて

7

Windowsの場合selectはソケット用にのみ定義されており、任意のファイルハンドルでは機能しません(ウィンドウにはファイル記述子の概念はありません)。この問題の詳細については、the msdn documentationを参照してください。また、選択モジュールのpython documentationにも記載されています。

任意のファイルにポーリングを使用する場合は、ポーリングソケットとファイルハンドルを抽象化するものを調べる必要があります。これはあなたの投稿へのコメントで言及されたねじれた原子炉かもしれません、またはlibuv、またはあなたが選んだ他のイベントライブラリにバインドされたpythonかもしれません。

+1

[WaitForMultipleObjects'](http:// msdn [pywin32](http://starship.python.net/crew/mhammond/win32/Downloads)から、マイクロソフトのWebサイト(http://www.microsoft.com/japan/windows/ie-us/library/windows/desktop/ms687025%28v=vs.85%29.aspx)にアクセスしてください。 html)。 –

+1

これはあまり正確ではありません。 Pythonのドキュメントでは、「Windowsでは、基本的なselect()関数はWinSockライブラリによって提供され、WinSockから始まらないファイル記述子は処理しません」と記載されています。それはあまり正確ではありません。あなたが言うように、Windowsにはファイル記述子の概念がありませんが、Cライブラリ(MSVCRT)はWinSockライブラリもそうします。問題はそれらが同じ概念ではないということです。(もっと楽しくするために、現代版のWinSockは実際にはselectでファイル記述子を使用しません; fd_setは実際にはハンドルの配列です...) – abarnert

+0

WaitForMultipleObjects/WaitForSingleObjectのように見えますが、ファイルハンドルには使用できませんコンソール入力。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms687025(v=vs.85).aspxを参照してください。 – dnaq