C -> Проблемы импорта в Python - PullRequest
1 голос
/ 16 марта 2011

Я определил имя моего объекта-оболочки в моем c-файле blargUtils.c следующим образом (я определил методы и массу для него в Blargmethods) ...

void initBlarg(){
    Py_InitModule("Blarg", Blargmethods);
}

Я скомпилировал его какитак ...

blarglib: blargUtils.c
    gcc -I/usr/include/python2.6 -fPIC -c blargUtils.c -Wall    
    gcc -shared blargUtils.o -o blargUtils.so
clean:  
    rm *.so

Однако, когда я пытаюсь импортировать оболочку в моем скрипте Python ...

import Blarg

Он говорит: «ImportError: Нет модуля с именем Blarg».Я немного растерялся здесь, и я не понимаю, почему он не может найти класс, когда они написаны точно так же.Может быть, это логическая ошибка?

Если нужно больше кода, дайте мне знать.

1 Ответ

1 голос
/ 17 марта 2011

Прежде всего, просматривая комментарии, я вижу, что переименование не сработало.Это означает, что (1) python не может найти файл .so, (2) файл .so не может быть использован (т.е. не скомпилирован правильно или не все необходимые символы найдены), или (3) существует .py /Файл .pyc / .pyo в том же каталоге, который уже имеет это имя.Если вы уже определили Blarg.py, python сначала будет смотреть на этот файл.То же самое происходит, если у вас есть каталог с именем Blarg в вашем пути поиска.Поэтому вместо того, чтобы прислонить голову к стене, попробуйте следующее:

1) Переименуйте вашу библиотеку .so во что-нибудь гарантированно не конфликтующее (например, _Blarg)

void initBlarg() {
    Py_InitModule("_Blarg", Blargmethods);
}

2) Скомпилируйте ееЖЕ ИМЯ

gcc -I/usr/include/python2.6 -fPIC -c blargUtils.c -Wall    
gcc -shared blargUtils.o -Wl,-soname -Wl,_Blarg.so -o _Blarg.so

3) Создайте оболочку Python (например, Blarg.py)

import sys
sys.path.append('/path/to/your/library')

import _Blarg

def blargFunc1(*args):
    """Wrap blargFunc1"""
    return _Blarg.blargFunc1(*args)

4) Теперь просто используйте его как обычно

import Blarg
Blarg.blargFunc1(1, 2, 3)

Очевидно, это немного излишне, но это должно помочь вам определить, где проблема.Надеюсь, это поможет.

...