【问题标题】:Python Embedding with IPython: WindowsError: [Error 193] %1 is not a valid Win32 application使用 IPython 嵌入 Python:WindowsError:[错误 193] %1 不是有效的 Win32 应用程序
【发布时间】:2014-11-28 21:25:47
【问题描述】:

尝试运行:

#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 位。

【问题讨论】:

    标签: python c++ ipython


    【解决方案1】:

    问题确实与 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:/Windows/winsxs/amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.21022.8_none_750b37ff97f4f68b/msvcr90.dll 复制 msvcr90.dll 的位置

    输入来自

    还有一些其他网页向我解释了如何执行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-07
      • 1970-01-01
      • 1970-01-01
      • 2017-03-16
      • 2015-09-29
      • 2013-02-28
      • 2020-02-19
      • 1970-01-01
      相关资源
      最近更新 更多