C -> Проблемы импорта в Python

1

Я определил имя моего объекта-оболочки в моем файле c blragUtils.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 script...

import Blarg

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

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

  • 0
    Я забыл упомянуть файл .os, скомпилированный, если это все равно поможет
  • 0
    Где вы положили скомпилированный файл .so? (Из какого каталога?) Откуда вы пытаетесь его импортировать? Как и любой другой модуль Python, модули, скомпилированные в C, должны находиться по пути Python, который нужно найти.
Показать ещё 3 комментария
Теги:
import
wrapper

1 ответ

1
Лучший ответ

Прежде всего, глядя на комментарии, я вижу, что переименование не сработало. Это означает, что (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)

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

  • 0
    Большое спасибо за это!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню