Отправляет email-рассылки с помощью сервиса Sendsay

За 2009-06-04

Re: Встраиваемый Pyton

2009/6/4 Крохин Анатолий Александрович <akroh***@b*****.ru>:
> В Thu, 4 Jun 2009 14:37:22 +0400
> Vladimir Efremov <vefrem***@g*****.com> пишет:
>
>> Некоторое затруднение может вызвать компоновка с библиотеками Python,
>
> Как раз в этом у меня загвоздка
>
>

вот небольшой пример:

код на с++ (pc.cpp):
#include <Python.h>
#include <iostream>
using namespace std;
int
main(int argc, char *argv[])
{
cerr << "Starting" << endl;
PyObject *pArgs, *pValue1, *pValue2;
int i1 = 3, i2 = 4;

Py_Initialize();
PyObject *pName = PyString_FromString("mod");
PyObject *pModule = PyImport_Import(pName);
cerr << "After import" << pModule << endl;
PyObject *pFunc = PyObject_GetAttrString(pModule, "f");
cerr << "pFunc" << pFunc << endl;
pArgs = PyTuple_New(2);
pValue1 = PyInt_FromLong(i1);
pValue2 = PyInt_FromLong(i2);
PyTuple_SetItem(pArgs, 0, pValue1);
PyTuple_SetItem(pArgs, 1, pValue2);
cerr << "Before calling" << endl;
PyObject *pValue = PyObject_CallObject(pFunc, pArgs);
cout << "Result: " << PyInt_AsLong(pValue) << endl;
Py_Finalize();
return 0;
}

Модуль на питоне:
import xmlrpclib
def f(a1, a2):
print "working", a1, a2
st = xmlrpclib.ServerProxy("http://ubuntu:8000")
print st.getServerName()
return a1 + a2

(здесь xmlrpclib нужен только для иллюстрации, что можно сложный
модуль, работающий с сетью проимпортировать)

Теперь собираем (руками) с системным питоном 2.5:
[efremov@ubuntu Python]$ g++ -c -I /usr/include/python2.5 pc.cpp
[efremov@ubuntu Python]$ g++ pc.o -o pc -Xlinker -export-dynamic
-L/usr/lib -l python2.5
и запускаем:
[efremov@ubuntu Python]$ PYTHONPATH=. ./pc
Starting
After import0xb7b6032c
pFunc0xb7b2c994
Before calling
working 3 4
RV_DBServer (9139; 9099)
Result: 7

Работает! А вот пример с PyRun_SimpleString почему-то падает. Некогда
разбираться.

   2009-06-04 21:50:48 (#868731)

Re: Встраиваемый Pyton

В Thu, 4 Jun 2009 13:53:57 +0400
Danila Vassenkov <vadani***@y*****.ru> пишет:

> Для C/C++ пример описан в документации:
> http://docs.python.org/extending/embedding.html
> http://docs.python.org/c-api/index.html
>
> С остальными языками это наверняка не сложнее, например, гугль
> на запрос "embedding python <you lang>" дает много результатов.

Это я уже нашел. Но тут пример в стиле "Hello! World!!!" Т. е. тут
используется только один библиотечный модуль. А как несколько? Мне,
например, нужно использовать re.

>
> Совсем экзотику можно попробовать подружить через линковку с C-кодом с обеих
> сторон. В любом случае, форк для "python -c" сработает везде и всегда :)

Так и предполагалось изначально.

Re: Встраиваемый Pyton

Hello.

Для C/C++ пример описан в документации:
http://docs.python.org/extending/embedding.html
http://docs.python.org/c-api/index.html

С остальными языками это наверняка не сложнее, например, гугль
на запрос "embedding python <you lang>" дает много результатов.

Совсем экзотику можно попробовать подружить через линковку с C-кодом с обеих
сторон. В любом случае, форк для "python -c" сработает везде и всегда :)

On Thu, 4 Jun 2009 11:17:44 +0400
Крохин Анатолий Александрович <akroh***@b*****.ru> wrote about "Встраиваемый Pyton":

>Прочел, что Pyton легко встраивается в качестве интерпретирующего языка
>в программы, написанные на другом языке, но нигде не нашел ни примера,
>ни указания как это сделать.
>
>Может кто подскажет?
>
>Нужна возможность работать из некого программного продукта - обращаться
>к интерпретатору Pyton и получать результаты его работы. А то и более
>сложное взаимодействие.
>

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 36136; Возраст листа: 2141; Участников: 1382
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/868489

   2009-06-04 15:59:08 (#868489)

Re: Встраиваемый Pyton

В Thu, 4 Jun 2009 14:37:22 +0400
Vladimir Efremov <vefrem***@g*****.com> пишет:

> Некоторое затруднение может вызвать компоновка с библиотеками Python,

Как раз в этом у меня загвоздка

Re: Встраиваемый Pyton

2009/6/4 Крохин Анатолий Александрович <akroh***@b*****.ru>:
> Прочел, что Pyton легко встраивается в качестве интерпретирующего языка
> в программы, написанные на другом языке, но нигде не нашел ни примера,
> ни указания как это сделать.
>
Мы этим пользуемся постоянно. Рецепты как это сделать довольно
подробно описаны в документе Extending and Embedding Python, глава 5.
Там же есть и образцы кода.
Некоторое затруднение может вызвать компоновка с библиотеками Python,
мы в результате собрали собственный экземпляр Python с динамической
библиотекой libpython, но это наше частное решение, продиктованное
необходимостью распространять программы в независимой от версии
дистрибутива линукс форме. Так что. нормальным решением будет
воспользоваться пакетом python2.x-dev, с которым устанавливаются и
заголовочные файлы, и статические библиотеки.

   2009-06-04 14:48:10 (#868455)

Re: Встраиваемый Pyton

В Thu, 4 Jun 2009 11:17:44 +0400
Крохин Анатолий Александрович <akroh***@b*****.ru> пишет:

> Прочел, что Pyton легко встраивается в качестве интерпретирующего языка
> в программы, написанные на другом языке, но нигде не нашел ни примера,
> ни указания как это сделать.
>
> Может кто подскажет?
>
> Нужна возможность работать из некого программного продукта - обращаться
> к интерпретатору Pyton и получать результаты его работы. А то и более
> сложное взаимодействие.
>

Нашел-таки как встроить питон:

8<#include <stdio.h>
#include <Python.h>

int main()
{
int result;
PyObject *pstr, *pmod, *pdict;

//инициализация интерпретатора
Py_Initialize();

pmod = PyImport_ImportModule("sys");
pdict = PyModule_GetDict(pmod);

//вычисление выражения из строки
pstr = PyRun_String("3+4*5",Py_eval_input,pdict,pdict);
//извлечение данных из объекта Python и вывод результата
PyArg_Parse(pstr,"i",&result);
printf("%i\n",result);

//удаление созданного Python объекта, завершение интерпретатора и выход
Py_DECREF(pstr);
Py_Finalize();

return 0;
}

8<Но как теперь подключить несколько модулей? Мне-то нужен re

Встраиваемый Pyton

Прочел, что Pyton легко встраивается в качестве интерпретирующего языка
в программы, написанные на другом языке, но нигде не нашел ни примера,
ни указания как это сделать.

Может кто подскажет?

Нужна возможность работать из некого программного продукта - обращаться
к интерпретатору Pyton и получать результаты его работы. А то и более
сложное взаимодействие.