У меня проблема с расширением 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’
Я ценю, если кто-то может помочь мне найти решение.
Спасибо
Вы импортируете пакет вместо расширения:
$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
если что-то не так, это указывает на то, что именно не хватает.
Других решений пока нет …