LINUX.ORG.RU

где взять Python.h


0

1

нужно вынести код с циклом в цикле в функцию спп. В инете часто встречается пример

$ cat c4py.c 
#include <Python.h>
....
что нужно доставить (Ubuntu), чтобы этот модуль появился
$ gcc --shared c4py.c -o three.so
c4py.c:1:20: fatal error: Python.h: Нет такого файла или каталога
compilation terminated.

Ответ на: комментарий от aho

установка не решила проблемы :-)

 gcc --shared c4py.c -o three.so
/usr/bin/ld: /tmp/ccaEX6M4.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
/tmp/ccaEX6M4.o: could not read symbols: Bad value
collect2: ld returned 1 exit status

$ cat c4py.c 
#include <python2.7/Python.h>
//реализация функции hipot() для Python
//val - тьюпл с аргументами вызова функции
static PyObject *HipotCmd(PyObject *self,PyObject *val)
{
    double a,b,c;
    //получаем переданные в функцию аргументы (определены два аргумента типа double)
    if(!PyArg_ParseTuple(val,"dd",&a,&b))
        return NULL;
    //вычисляем результат - длину гипотенузы
    c = sqrt(a*a+b*b);
    //преобразуем результат в объект Python и возвращаем результат преобразования интерпретатору
    return Py_BuildValue("d",c);
}
//таблица методов модуля для интерпретатора
static PyMethodDef threeMethods[] = {
    {"hipot",HipotCmd,METH_VARARGS,"Calc hipotenuse"},
    {NULL,NULL,0,NULL}
};
//инициализация модуля three
void initthree(void)
{
    Py_InitModule("three",threeMethods);
}

пример отсюда http://python.su/blog/public/2008/09/17/prostoj-primer-rasshireniya-python/

math-beginer
() автор топика
Ответ на: комментарий от math-beginer
$ pwd
/usr/include/python2.7

$ ls Python.h 
Python.h

$ python
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) 
[GCC 4.5.2] on linux2
math-beginer
() автор топика
Ответ на: комментарий от aho

так?

$ gcc  -fPIC c4py.c -o three.so/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/../../../crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
/tmp/cc2XuwV5.o: In function `HipotCmd':
c4py.c:(.text+0x2c): undefined reference to `PyArg_ParseTuple'
c4py.c:(.text+0x74): undefined reference to `sqrt'
c4py.c:(.text+0x8f): undefined reference to `Py_BuildValue'
/tmp/cc2XuwV5.o: In function `initthree':
c4py.c:(.text+0xb8): undefined reference to `Py_InitModule4_64'
collect2: ld returned 1 exit status

math-beginer
() автор топика
Ответ на: комментарий от aho

да, надо еще "-lm -lpython2.5", или какая там версия

ну да, странно, что math он не требует, примере даже нет include <math.h>.

math-beginer
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.