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 почему-то падает. Некогда
разбираться.