AttributeError в расширении python с переполнением стека C /

У меня проблема с расширением Python простым C-файлом.

hello.c исходный код:

#include <Python.h>

static PyObject* say_hello(PyObject* self, PyObject* args)
{
const char* name;

if (!PyArg_ParseTuple(args, "s", &name))
return NULL;

printf("Hello %s!\n", name);

Py_RETURN_NONE;
}

static PyMethodDef HelloMethods[] =
{
{"say_hello", say_hello, METH_VARARGS, "Greet somebody."},
{NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC
inithello(void)
{
(void) Py_InitModule("hello", HelloMethods);
}

setup.py:

from distutils.core import setup, Extension

module1 = Extension('hello', sources = ['hello.c'])

setup (name = 'PackageName',
version = '1.0',
packages=['hello'],
description = 'This is a demo package',
ext_modules = [module1])

Я также создал пустой файл «__init__.py» в папке «привет».

После вызова «python setup.py build» я могу импортировать привет, но когда я пытаюсь
использовать «hello.say_hello ()» я сталкиваюсь с ошибкой:

Traceback (последний вызов был последним):
Файл «< stdin> «, строка 1, в
AttributeError: у объекта ‘module’ нет атрибута ‘say_hello’

Я ценю, если кто-то может помочь мне найти решение.

Спасибо

2

Решение

Вы импортируете пакет вместо расширения:

$python2 hello_setup.py build
running build
running build_py
# etc.
$cd build/lib.linux-x86_64-2.7/
$ls
hello  hello.so
$python
Python 2.7.4 (default, Apr 19 2013, 18:28:01)
[GCC 4.7.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import hello
>>> hello
<module 'hello' from 'hello/__init__.py'>

Если вы хотите импортировать расширение, hello.soЗатем вы должны либо переименовать его, либо поместить его в пакет. В каком случае вы можете использовать from hello import hello импортировать это:

$mv hello.so hello
$python2
Python 2.7.4 (default, Apr 19 2013, 18:28:01)
[GCC 4.7.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from hello import hello
>>> hello
<module 'hello.hello' from 'hello/hello.so'>
>>> hello.say_hello("World!")
Hello World!!

Я не вижу причины иметь пакет, который содержит только один модуль расширения.
Я бы просто избавился от пакета, используя более простую настройку:

from distutils.core import setup, Extension

module1 = Extension('hello', sources=['hello.c'])

setup(name='MyExtension',
version='1.0',
description='This is a demo extension',
ext_modules=[module1])

Это будет производить только hello.so библиотека, и вы можете просто сделать:

>>> import hello

Чтобы импортировать расширение.

Общий совет: избегайте использования более одного модуля / пакета с одинаковым именем.
Иногда трудно сказать, какой модуль импортирован (как в вашем случае).
Кроме того, при использовании разных имен вместо импорта неправильного модуля и получения странных ошибок вы увидите ImportError если что-то не так, это указывает на то, что именно не хватает.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]