使用IPython进行Python嵌入:WindowsError:[错误193]%1不是有效的Win32应用程序

时间:2014-11-28 21:25:47

标签: python c++ ipython

尝试运行:

#include <Python.h>

int
main(int argc, char *argv[])
{
  Py_SetProgramName(argv[0]);  /* optional but recommended */
  Py_Initialize();
  PyRun_SimpleString("import IPython\n"
                     "IPython.embed()\n");
  Py_Finalize();
  return 0;
}

使用Windwos 7下的mignw64 gcc 4.6.0(g++ -I /c/prog64/Python27/include t.cpp /c/prog64/Python27/libs/libpython27.a)编译我收到错误:

$ a.exe
Traceback (most recent call last):
  File "<string>", line 2, in <module>
  File "c:\prog64\python27\lib\site-packages\IPython\terminal\embed.py", line 290, in embed
    shell = InteractiveShellEmbed.instance(**kwargs)
  File "c:\prog64\python27\lib\site-packages\IPython\config\configurable.py", line 354, in instance
    inst = cls(*args, **kwargs)
  File "c:\prog64\python27\lib\site-packages\IPython\terminal\embed.py", line 92, in __init__
    display_banner=display_banner
  File "c:\prog64\python27\lib\site-packages\IPython\terminal\interactiveshell.py", line 328, in  __init__
    **kwargs
  File "c:\prog64\python27\lib\site-packages\IPython\core\interactiveshell.py", line 483, in __init__
    self.init_readline()
  File "c:\prog64\python27\lib\site-packages\IPython\core\interactiveshell.py", line 1817, in init_readline
    import IPython.utils.rlineimpl as readline
  File "c:\prog64\python27\lib\site-packages\IPython\utils\rlineimpl.py", line 21, in <module>
    _rl = __import__(_rlmod_name)
  File "c:\prog64\python27\lib\site-packages\readline.py", line 6, in <module>
    from pyreadline.rlmain import Readline
  File "c:\prog64\python27\lib\site-packages\pyreadline\__init__.py", line 11, in <module>
    from . import unicode_helper, logger, clipboard, lineeditor, modes, console
  File "c:\prog64\python27\lib\site-packages\pyreadline\console\__init__.py", line 15, in <module>
    from .console import *
  File "c:\prog64\python27\lib\site-packages\pyreadline\console\console.py", line 610, in <module>
    msvcrt = cdll.LoadLibrary(ctypes.util.find_msvcrt())
  File "C:\prog64\Python27\Lib\ctypes\__init__.py", line 443, in LoadLibrary
    return self._dlltype(name)
  File "C:\prog64\Python27\Lib\ctypes\__init__.py", line 365, in __init__
    self._handle = _dlopen(self._name, mode)
WindowsError: [Error 193] %1 is not a valid Win32 applicationTraceback (most recent call last):

请注意PyRun_SimpleString中的其他命令可以正常工作;另外,在命令行python会话中:

import IPython
IPython.embed()

作品。

我希望问题与_dlopen查找的MSVCR90.DLL有关,以及g ++链接到“普通”MSVCRT.DLL的事实。使用VS2008进行编译并非易事。使用VS2010进行编译时会看到相同的错误消息。 Python设置是Anaconda Python 2.7.8 64位。

1 个答案:

答案 0 :(得分:2)

问题确实与msvcr90.dll有关。解决它的方法是将程序与msvcr90.dll相关联。但是,要链接msvcr90.dll,您需要有一个清单,否则您将收到运行时错误。这个清单看起来像:

<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="amd64" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
</assembly>

我使用文本编辑器从python.exe中提取并命名为msvcr90.manifest。此清单使用资源文件msvcr90.rc

链接到应用程序
#include "winuser.h"
1 RT_MANIFEST msvcr90.manifest

可以使用以下方法将其转换为目标文件:

windres msvcr90.rc msvcr90.o

然后,使用此资源文件和msvcr90.dll编译程序变为:

g++ -I /c/prog64/Python27/include t.cpp /c/prog64/Python27/libs/libpython27.a msvcr90.o msvcr90.dll

我从c复制了msvcr90.dll:/Windows/winsxs/amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.21022.8_none_750b37ff97f4f68b/msvcr90.dll

输入来自

和其他一些网页向我解释了如何做到这一点。