Ошибка генерации индекса Haystack / Whoosh

Я пытаюсь настроить стог сена с бэкэндом whoosh. Когда я пытаюсь сгенерировать индекс [или любую команду индекса, если на то пошло], я получаю:

TypeError: Item in ``from list'' not a string

если я полностью удалю свой search_indexes.py, я получу ту же ошибку [поэтому я предполагаю, что он вообще не может найти этот файл]

что может вызвать эту ошибку? он настроен на автообнаружение, и я уверен, что мое приложение установлено, потому что я в настоящее время его использую.

Полная трассировка:

    Traceback (most recent call last):
  File "./manage.py", line 17, in <module>
    execute_manager(settings)
  File "/Users/ghostrocket/Development/Redux/.dependencies/django/core/management/__init__.py", line 362, in execute_manager
    utility.execute()
  File "/Users/ghostrocket/Development/Redux/.dependencies/django/core/management/__init__.py", line 303, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Users/ghostrocket/Development/Redux/.dependencies/django/core/management/__init__.py", line 257, in fetch_command
    klass = load_command_class(app_name, subcommand)
  File "/Users/ghostrocket/Development/Redux/.dependencies/django/core/management/__init__.py", line 67, in load_command_class
    module = import_module('%s.management.commands.%s' % (app_name, name))
  File "/Users/ghostrocket/Development/Redux/.dependencies/django/utils/importlib.py", line 35, in import_module
    __import__(name)
  File "/Users/ghostrocket/Development/Redux/.dependencies/haystack/__init__.py", line 124, in <module>
    handle_registrations()
  File "/Users/ghostrocket/Development/Redux/.dependencies/haystack/__init__.py", line 121, in handle_registrations
    search_sites_conf = __import__(settings.HAYSTACK_SITECONF)
  File "/Users/ghostrocket/Development/Redux/website/../website/search_sites.py", line 2, in <module>
    haystack.autodiscover()
  File "/Users/ghostrocket/Development/Redux/.dependencies/haystack/__init__.py", line 83, in autodiscover
    app_path = __import__(app, {}, {}, [app.split('.')[-1]]).__path__
TypeError: Item in ``from list'' not a string

а вот мой search_indexes.py

from haystack import indexes
from haystack import site
from myproject.models import *

site.register(myobject)

person Keith Fitzgerald    schedule 28.12.2009    source источник
comment
Какие версии Python и whoosh?   -  person Tom    schedule 28.12.2009
comment
Опубликуйте полную трассировку и содержимое вашего search_indexes.py.   -  person John Debs    schedule 28.12.2009
comment
опубликовано. Спасибо! также я включил слегка исправленное сообщение.   -  person Keith Fitzgerald    schedule 29.12.2009


Ответы (4)


Похоже, вы столкнулись с двумя проблемами.

Первый — это тот, который генерирует этот TypeError. Это происходит, когда Haystack ищет в каждом приложении, которое вы указали в INSTALLED_APPS, файл search_indexes.py (поскольку вы регистрируетесь автоматически). Я точно не знаю, в чем проблема, но я бы начал с поиска в вашем проекте from list и перепроверил ваш код. Раньше я не сталкивался с этим исключением, но если это происходит в коде, который вы написали, вы должны опубликовать любые соответствующие разделы в своем вопросе.

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

Тем не менее, в этом файле должно быть больше событий (что является второй проблемой). Вы должны создать индексный класс (который наследуется от haystack.indexes.SearchIndex) и зарегистрировать его в модели. Инструкции и пример см. в этом разделе документации.

Я бы также задал этот вопрос в группе Google django-haystack, поскольку автор и другие пользователи haystack увидят его там, и они, как правило, будут чрезвычайно полезны.

person John Debs    schedule 29.12.2009
comment
Спасибо! на самом деле я заставил его работать, полностью обойдя search_indexes.py и просто поместив все в search_sites.py. Я все еще пытаюсь отследить точную проблему, и в этот момент я обязательно опубликую ее здесь. Еще раз спасибо за нашу помощь! - person Keith Fitzgerald; 29.12.2009

Я только что столкнулся с тем же сообщением TypeError с совершенно другим стеком.

Поиск по всему сообщению об ошибке дал два результата: этот вопрос и исходный код Python import.c. Итак, немного покопавшись, я обнаружил, что эта конкретная ошибка возникает, когда встроенной функции __import__ передается имя импорта, которое не является строкой.

Важным словом здесь является строка, т.е. объект str. Все остальные (например, unicode) будут отклонены с описанной здесь ошибкой.

Итак, решение таково: везде, где вы передаете имя модуля/члена чему-то, что будет его динамически импортировать, убедитесь, что это str, а не unicode.

Не удается:

__import__('mylib.foo', globals(), locals(), [u'bar'])

Работа:

__import__('mylib.foo', globals(), locals(), ['bar'])
__import__(u'mylib.foo', globals(), locals(), ['bar'])

Конечно, это, вероятно, относится только к Python 2.x, учитывая, что 3.x по-разному обрабатывает строки/юникод.

person Romløk    schedule 21.04.2010
comment
Потрясающая работа! Я столкнулся с этим случайным образом так же, как и вы ... поиск на SO этой строки ошибки вызывает только этот вопрос. Преобразование моего юникода в строку работает прекрасно. - person Adam Wagner; 20.12.2011
comment
Сегодня вечером я чуть не вырвал себе волосы из-за той же проблемы с импортом юникода - СПАСИБО, голосую! - person eCaroth; 24.01.2012

В моем случае это произошло после того, как я обновил свой django-tastypie до версии 0.10. В рамках переноса Py3 from __future__ import unicode_literals был добавлен в начало миграций.

После того, как я прокомментировал эту строку в каждом файле миграции deliciouspie, мои миграции прошли нормально.

Что меня озадачивает, так это тот факт, что миграция вкусных пирогов вчера прошла нормально с новой версией вкусного пирога (в отдельном проекте, который использует тот же virtualenv). Это загадка для другого дня.

person Ngure Nyaga    schedule 08.08.2013

Вчера вечером я столкнулся с той же ошибкой в ​​кодовой базе, которая работала 5 минут назад без каких-либо изменений. Пока я просматривал свой репозиторий git, код, который работал ранее, вызывал ту же ошибку. Я привел свое значение Unicode к строке, и это устранило проблему, но не решило основную причину.

Итак, я понял, что если:

  1. это не пришло из моего кода
  2. он был поднят в функции python import
  3. ни мой питон, ни кодовая база не изменились

проблема должна была быть в битовом коде. Я удалил все файлы .pyc и .pyo в своем приложении. И ошибка исчезла.

удаление файлов .py:

find . -name "*.pyc" -exec rm -f {} \;
find . -name "*.pyo" -exec rm -f {} \;
person matias    schedule 05.05.2013