星期三, 8月 26, 2015

pyenv, IronPython 與 pip

會去追 code 主要是試著解決 Linux 下的 pip 不能用 IronPython 的問題,後來是沒解,但這是在去年年底時看的,我不知道現在是不是已經解決了。
pyenv install -l 這指令,大致做下面幾件事情:
  • 呼叫 .pyenv/plugins/python-build/bin/pyenv-install
  • pyenv-install 又呼叫 .pyenv/plugins/python-build/bin/python-build --definitions
  • python-build --definitions 實際上是把 .pyenv/plugins/python-build/share/python-build 下的資料夾都列出來
因 為 IronPython 2.7.5 才支援 pip,想要用 IronPython 2.7.5 (或更新的版本) ,可以這麼做:複製 .pyenv/plugins/python-build/share/python-build/ironpython-2.7.4 為 ironpython-2.7.5,把裏面的下載位址改為 https://github.com/IronLanguages/main/releases/download/ipy-2.7.5/IronPython-2.7.5.zip
這樣子,pyenv install -l 就會列出 ironpython-2.7.5,而且也可以下載安裝。
安裝 2.7.5 以後,用 pyenv shell ironpython-2.7.5 切換為 IronPython 2.7.5。
依照 2.7.5 的 release note 裡去執行 python -X:Frames -m ensurepip 時,卻出現以下的錯誤:
OSError: IronPython.Runtime.Exceptions.OSException: cannot load library 
  at IronPython.Modules.CTypes.LoadLibrary (System.String library, Int32 mode) [0x00000] in :0 
  at IronPython.Modules.CTypes.dlopen (System.String library, Int32 mode) [0x00000] in :0 
  at Microsoft.Scripting.Interpreter.FuncCallInstruction`3[System.String,System.Int32,System.Object].Run (Microsoft.Scripting.Interpreter.InterpretedFrame frame) [0x00000] in :0 
  at Microsoft.Scripting.Interpreter.Interpreter.Run (Microsoft.Scripting.Interpreter.InterpretedFrame frame) [0x00000] in :0
會有這樣的錯誤,最主要是因為 ironpython-2.7.5/bin/Lib/ctypes/__init__.py 裡的 436~441 行,這裡是這樣寫的:

if _os.name in ("nt", "ce"):
  pythonapi = PyDLL("python dll", None, _sys.dllhandle)
elif _sys.platform == "cygwin":
   pythonapi = PyDLL("libpython%d.%d.dll" % _sys.version_info[:2])
else:
   pythonapi = PyDLL(None)

這邊傳了 None 到 PyDLL,而 PyDLL 裡 (就 353 行) 的 _dlopen() 無法開啟 None ,才丟出這個 exception,有試著加程式處理掉這個 exception,但是,後續會因為這行
memmove = CFUNCTYPE(c_void_p, c_void_p, c_void_p, c_size_t)(_memmove_addr) 而出現 SystemError: LocalAlloc 錯誤
結論,Linux 下,IronPython 還是沒辦法用 pip ,另外就是,我不知道現在修正了沒。

沒有留言: