Cygwinで、pipeやforkを使うとエラーが起きる場合の対策方法
ってな訳で、IPython for Cygwinでポチポチ弄って遊んでいる訳だが。
help関数を呼び出すと、エラーが起きたりする。
In [1]: import sys In [2]: help(sys) 4 [main] python2.4 4488 fork_parent: child 4736 died waiting for dll loading --------------------------------------------------------------------------- exceptions.OSError Traceback (most recent call last) ... /tmp/python.572/usr/lib/python2.4/pydoc.py in <lambda>(text) 1321 return lambda text: tempfilepager(plain(text), 'more <') 1322 if hasattr(os, 'system') and os.system('(less) 2>/dev/null') == 0: -> 1323 return lambda text: pipepager(text, 'less') 1324 1325 import tempfile /tmp/python.572/usr/lib/python2.4/pydoc.py in pipepager(text, cmd) 1340 def pipepager(text, cmd): 1341 """Page through text by feeding it to another program.""" -> 1342 pipe = os.popen(cmd, 'w') 1343 try: 1344 pipe.write(text) OSError: (0, 'Error')
むぅ。困った、困った。
どうやら、pipeを使う所でエラーが起きるみたいなんだな。
ちなみに、拡張モジュールを突っ込んでみた時 気付いたんだが、fork 関数を呼び出すと 同じようなエラーが起きる。
ってんで、ぐぐーる先生にお伺いを立てると、以下が見つかった。
電脳Rubyプロダクツ Cygwin binaries
http://ruby.gfd-dennou.org/tutorial/install/cygwin/package-j.html
rebase問題
Cygwin で Ruby のプログラムを動かしていると,
...
D:\cygwin\bin\ruby.exe: *** unable to remap D:\cygwin\bin\cygssl.dll to same address as parent(0xDF0000) != 0xE00000
...
みたいなメッセージが延々と出力されてどうしようもなくなることがあります.このようになったときは,そのプログラムを中止し,
$ rebaseall
というコマンドを実行してやると回避できます.setup.exe から rebase というパッケージをインストールしておく必要があります.
これはRubyだけで起こる問題ではなく,Cygwin fork() の問題だそうです.詳しくは rebase のドキュメント (/usr/share/doc/Cygwin/rebase-x.x.README) などを見てください.
つまりは、rebaseall ってパッケージを突っ込んで、呼び出せばOKらしい。
rebase パッケージは、Systemカテゴリの下にある。
で、入れた後、呼び出すと こんなメッセージ。
$ rebaseall rebaseall: only ash processes are allowed during rebasing Exit all Cygwin processes and stop all Cygwin services. Execute ash from Start/Run... or a cmd or command window. Execute '/bin/rebaseall' from ash.
ふむふむ、一旦サービスを止めて、ashシェル上で動かせ。っていう事らしい。
という訳で、次の手順で実行。
1.スタートメニュー→ファイル名を指定して実行。
2."ash"といれて実行。(Cygwinの/bin フォルダにパスを通しておいて良かった)
3."rebaseall"を呼び出す。
rebaseallの呼び出しは、凡そ10数秒くらいだった。
で、再度 Cygwinシェルから IPythonを立ち上げて、helpコマンドを呼び出す。
In [1]: import sys In [2]: help(sys)
ちゃんと動いたよ。うひょ。