Cython PYD - это DLL, есть ли простой способ встроить Python в исполняемый файл, вызывающий его?

Я пытаюсь встроить Python в C++.exe, используя NumPy, Pandas, SciPy и некоторые скомпилированные файлы Cython PYD. Есть несколько инструкций по встраиванию Python, но они на самом деле не распространяются на дополнительные библиотеки: чтобы убедиться, что это работает на компьютерах с Windows, на которых отсутствует моя версия Python, я использую встроенную библиотеку для 3.5.1 здесь, в которой мало документации по ее использованию: https://docs.python.org/3.5/using/windows.html#embedded-distribution

И перед вызовом Py_Initialize() я извлекаю файл python35.zip из встроенного дистрибутива и помещаю его в каталог проекта, а затем ссылаюсь на него, как описано здесь: http://www.myoddweb.com/2016/02/27/встроить-python-в-ваше-c-приложение-без-python-установленного-на-гостевой-машине/ т.е.

#include <Python.h>
std::wstring python_path;
python_path += L"\\pythonlibs\\python35.zip";
Py_SetPath(python_path.c_str());
Py_Initialize();

По какой-то причине я не могу запустить скомпилированную версию. Я пытался отделить Python от сборки моей системы. Я все еще ссылаюсь на включения Numpy из моего системного пути, хотя C:\Anaconda3\Lib\site-packages\numpy\core\include, не уверен, что это проблематично. Весь мой код работает быстро, потому что я использую NumPy MemoryViews и оптимизированную обработку данных Pandas, которую мне нужно сохранить. Здесь я не эксперт по MSVC, поэтому просто ищу любого, кто может направить меня в правильном направлении по внедрению Python. Очень признателен.


person Matt    schedule 26.06.2016    source источник
comment
python_path += L"\\python35.zip"; будет ссылаться на что-то вроде C:\python35.zip, что, вероятно, не то, что предполагалось.   -  person J.J. Hakala    schedule 27.06.2016
comment
Хороший звонок @ J.J.Hakala Я скопировал .zip в C:\, и теперь он просто падает при попытке запустить интерпретатор Python вместо отображения сообщений об ошибках ... Необработанное исключение по адресу 0x00000000000000000 в EmbedPythonNumpyC++.exe: 0xC0000005: нарушение прав доступа место выполнения 0x00000000000000000. когда я запускаю отладчик. По крайней мере ближе к запуску   -  person Matt    schedule 27.06.2016
comment
Извините за вышеизложенное, я понимаю, что адреса памяти никому не помогают устранять неполадки... // Выполните некоторую работу. external_work_1d(num_x, some_1d_data, ответ); std::cout ‹‹ \nexample_application.main: answer_1d = ‹‹ *answer ‹‹ std::endl; падает после указателя на *answer здесь, я полагаю: // Вызвать модуль Python и выполнить некоторую работу. inner_work_1d(num_x, some_1d_data, ответ); // Определено в файле wrapper_inner_api.h   -  person Matt    schedule 27.06.2016
comment
Если вы используете демонстрационный код, как минимум одна проблема: код типа import_wrapper_inner(), который не проверяет возвращаемое значение. Я попытался объяснить, к чему это может привести, в ответе. Вы можете попробовать установить переменную среды PYTHONPATH, чтобы она указывала на каталог, в котором находится ваш модуль расширения и другие вещи.   -  person J.J. Hakala    schedule 27.06.2016
comment
Спасибо @J.J.Hakala, может пригодится в будущем. У меня все еще есть проблемы с компиляцией этого тестового сценария, как вы упомянули, но я могу попробовать сделать это встраивание другим способом. Изменил мой вопрос, чтобы отразить новую цель.   -  person Matt    schedule 27.06.2016