Функция добавлена в C-код и интерфейс Swig не распознан; «Нет атрибута« set_latency »»

1

Я использую libmpsse для связи с чипом FTDI, и для увеличения пропускной способности я хотел добавить функцию в код C, чтобы уменьшить задержку чипа (поддерживается libFTDI), а затем подключить функцию с помощью swig для использования с Python. Однако, когда я вызываю созданную функцию, я получаю сообщение об ошибке: нет атрибута 'set_latency' (подробности ниже).

В mpsse.c я добавил внизу:

int set_latency(struct mpsse_context* mpsse, int latency) {
    return ftdi_set_latency_timer(&mpsse->ftdi, latency);
}

К mpsse.h, я добавил после функции Version:

int set_latency(struct mpsse_context* mpsse, int latency);

Затем я перекомпилировал интерфейс swig, используя:

make clean
swig -python mpsse.i
gcc -fpic -c mpsse.c mpsse_wrap.c -I/usr/include/python2.7/
gcc -shared mpsse.o mpsse_wrap.o -o _mpsse.so

Я не знаком с swig, но в mpsse.i включен mpsse.h, который, я считаю, означает, что его не нужно менять.

После использования swig это добавляется к коду, сгенерированному swig в файле pylibmpsse.py:

def set_latency(mpsse, latency):
    return _pylibmpsse.set_latency(mpsse, latency)
set_latency = _pylibmpsse.set_latency

И я вызываю сгенерированный код, добавляя это к mpsse.py:

def set_latency(self, latency):
    return _mpsse.set_latency(self.context, latency)

Это сообщение об ошибке:

Traceback (most recent call last):
  File "bw-test.py", line 1, in <module>
    from mpsse import *
  File "[...]/libmpsse-master/src/mpsse.py", line 1, in <module>
    import pylibmpsse as _mpsse
  File "[...]/libmpsse-master/src/pylibmpsse.py", line 455, in <module>
    set_latency = _pylibmpsse.set_latency
AttributeError: 'module' object has no attribute 'set_latency'

Ошибка, похоже, подразумевает, что что-то не так с файлом pylibmpsse.py или _pylibmpsse (сгенерировано с помощью swig_import_helper()), но я недостаточно знаком с swig, чтобы знать. Я попытался явно объявить функцию, которую я добавил в mpsse.i, и некоторые изменения форматирования, которые я видел в похожих вопросах stackoverflow, но ни одно из них не изменило сообщение об ошибке. Если кто-то может дать некоторое представление о том, что я делаю неправильно, мы будем очень благодарны!

Теги:
swig
ftdi

2 ответа

0

После компиляции с _pylibmpsse.so в качестве имени общего объекта, я получаю эту ошибку. freq2div - это функция, которую я не добавлял, но находится в библиотеке libmpsse.

File "bw-test.py", line 1, in <module>
  from mpsse import *
File "[...]/libmpsse-master/src/mpsse.py", line 1, in <module>
  import pylibmpsse as _mpsse
File "[...]/libmpsse-master/src/pylibmpsse.py", line 21, in <module>
  _pylibmpsse = swig_import_helper()
File "[...]/libmpsse-master/src/pylibmpsse.py", line 20, in swig_import_helper
  return importlib.import_module('_pylibmpsse')
File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
  __import__(name)
ImportError: [...]/libmpsse-master/src/_pylibmpsse.so: undefined symbol: freq2div
0

Похоже, что модуль расширения, генерируемый SWIG, является _pylibmpsse, поэтому ваша последняя команда gcc должна быть:

gcc -shared mpsse.o mpsse_wrap.o -o _pylibmpsse.so

Другими словами, я подозреваю, что вы не заменили оригинальный SWIG-модуль.

  • 0
    Разве это не больше комментарий, чем ответ?
  • 0
    Я не уверен, что ты имеешь в виду. Я объяснил ОП точно, в чем была проблема и решение. Можете ли вы уточнить, почему это похоже на комментарий?
Показать ещё 9 комментариев

Ещё вопросы

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