Sergio
Июнь 22, 2007 23:44:28
Здраствуйте. Решил “слить” двя языка (Python и С++).Вот простой пример который нарыл в нете:
Код python(файл Test.py):
print “Hello World!”
Код С из которого и будет вызыватся “питоновский” файл:
#include “stdafx.h”
#include “D:\Python25\include\Python.h”
#pragma comment(lib,“python25.lib”)
int _tmain(int argc, _TCHAR* argv)
{
FILE *fp;
Py_Initialize();
fp = fopen(“Test.py”, “r”);
if(fp)
{
PyRun_SimpleFile(fp, “Test.py”);
fclose(fp);
}
Py_Finalize();
return 0;
}
Проблема в том, что приложение “крушится” Помогите разобратся с проблемой.
Зарание спасибо.
bialix
Июнь 23, 2007 00:29:19
во-первых для нормальной связки Си и Питона нужно пользовать MS VS 7.1. иначе возможны проблемы.
во-вторых, скрипт можно прочесть в строку и запустить на выполнение из строки, а не из файла. только функция нужна PyRun_SimpleString.
но на самом деле это очень примитивный уровень связки.
Андрей Светлов
Июнь 23, 2007 11:13:18
Попытка ткнуть пальцем в небо, конечно…
Думаю, беда в PyRun_SimpleFile и неверной runtime library.
Должна быть multi-threaded dll.
Иначе происходит нестыкняк с тем, что на самом деле представляет из себя FILE*
А связывать действительно лучше не так. По личному опыту: удобней extending, а не embedding.
Murr_vk
Июнь 26, 2007 01:19:44
bialix
но на самом деле это очень примитивный уровень связки.
А как еще можно связать два этих могучих языка?
bialix
Июнь 26, 2007 07:03:20
Murr_vk
bialix
но на самом деле это очень примитивный уровень связки.
А как еще можно связать два этих могучих языка?
у Лутца много на эту тему. Суть в том, что в этом простом примере подымается интерпретатор питона и в нем запускается некеий питон-скрипт, потом все останавливается.
В более сложном случае Си-код подымает интерпретатор в начале работы, потом периодически дергает какие-то функции питона, а питон может дергать какие-то функции из Си. Т.е. когда используется действительно полноценная связка в обе стороны.
Андрей Светлов
Июнь 26, 2007 07:43:33
Маленькая поправка.
Практика показала, что Си код, поднимающий интерпретатор и дергающий его - как правило признак плохой архитектуры (но есть и исключения).
Трудно пишется, еще труднее отлаживается.
Ся, вызываемые из Питона - гораздо гибче и универсальней. И этого варианта влолне достаточно.
solowey
Апрель 1, 2011 10:38:28
В VS2010 тот же геморой…
bialix
у Лутца много на эту тему.
Что за книга? Название в студию.
truporez
Апрель 1, 2011 12:18:40
agalen
Апрель 1, 2011 16:48:16
Поддерживаю насчет pyrex - там есть возможность делать модули для python и есть генерация *.h файлов для вызова из С/С++.
Андрей Светлов
Апрель 1, 2011 17:19:02
Сначала, не Pyrex а Cython - первый помер.
Второе: Cython предназначен для генерации Python C Extensions. Он делает это хорошо.
Насколько понимаю, требуется обратная задача - embedding Python в С++ код.
Я много работал с обоими случаями, поверьте. Не стоит их путать.