Попытка запустить:
#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;
}
скомпилировано с mignw64 gcc 4.6.0 ( g++ -I /c/prog64/Python27/include t.cpp /c/prog64/Python27/libs/libpython27.a
) под Windwos 7 я получаю ошибку:
$ 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()
работает.
Я ожидаю, что проблема связана с MSVCR90.DLL, где ищет _dlopen, и с тем фактом, что g ++ ссылается на «нормальную» MSVCRT.DLL. Компиляция с VS2008 — нелегкий вариант. Такое же сообщение об ошибке появляется при компиляции с VS2010. Установкой Python является Anaconda Python 2.7.8 64 бит.
Проблема действительно связана с 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
куда я скопировал msvcr90.dll из c: /Windows/winsxs/amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.21022.8_none_750b37ff97f4f68b/msvcr90.dll
Вход для этого пришел от
и пару других веб-страниц, которые объяснили мне, как это сделать.