Vim の Python コード補完でエラー(似非解決) #pyhack:

(第31回)Python mini Hack-a-thon に参加してきた。

最近使い始めた VimPython を書いていると、補完時にランタイムエラーが発生していたので、その解決方法を調べた。
回避方法は見つかったけれど、スジが悪いので別解がほしい。

問題

環境

OS: Windows7 Home Premium 64bit
Vim: kaoriya版 7.3.935 32bit(64bit だとプラグインの使用によって落ちることがあったため)
Python: 2.7.3 32bit
wxPython: wxPython2.8-win32-unicode-2.8.12.1-py27.exe

現象

MultiPyAlarm.py のようなファイルで self. まで入力すると下のようなランタイムエラーが発生する。


試行1

64bit版Vimから一部の64bit版のPythonモジュールを呼び出せない? ・ Issue #302 ・ vim-jp/issues を参考に C:\Windows\SysWOW64\pywintypes27.dll へ以下の manifest を埋め込んでみても現象は変わらず。

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
</assembly>
Resource Type: 24
Resource Name: 1
Resource Language: 1033

32bit なのでこれで良いと思っているんだけど、それも違うのかな?
加えて C:\Windows\SysWOW64\python27.dll へも同様の対応を取ってみたが、こちらも変わらず。

試行2

python - Runtime Error with Vim Omnicompletion - Stack Overflow と同様に gvim.exe の manifest を入れ替えてやると動くようになった。
コマンドプロンプトから

"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" x86
mt.exe -inputresource:M:\OLS\Program\Python27\python.exe;#1 -out:M:\ols\Text\vim\python.exe.manifest
mt.exe -inputresource:M:\ols\Text\vim\gvim.exe;#1 -out:M:\ols\Text\vim\gvim.exe.org.manifest
REM gvim.exe.org.manifest の dependency - dependentAssembly - assemblyIdentity を python.exe.manifest のものに書き換えて gvim.exe.manifest で保存。
mt.exe -manifest M:\ols\Text\vim\gvim.exe.manifest -outputresource:M:\ols\Text\vim\gvim.exe;1

gvim.exe.manifest

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
  <assemblyIdentity processorArchitecture="*" version="7.3.0.0" type="win32" name="Vim"></assemblyIdentity>
  <description>Vi Improved - A Text Editor</description>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
  
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
  
  <asmv3:application>
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>true</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>

試行3

gvim.exe にこのような manifest を埋め込んでやるのはおかしいよね? ということで別解を探したけど見つからず。

試行2 の結果、補完時に gvim.exe 読み込まれている DLL 【1】とエラーとなった際に読み込まれている DLL 【2】を比べてみると、【1】は wxPython 関係の DLL が幾つか多く読み込まれていた(他にもあったけど)。ということで、そいつらに manifest を埋め込んでやれば gvim での対応は不要になるのではないかと考えている。でもこれ全部に? ということで躊躇してしまっている。ということで、今は gvim.exe に埋め込めばいいやと落ち着いた。

補足

pyhack の成果発表時に libpython は? という話が出たので探してみたところ、 M:\OLS\Program\Python27\libs\libpython27.a があるらしいことはわかったけれど、これをどうすれば良いのかまではわからず。