Грешка при генериране на индекс Haystack / Whoosh

Опитвам се да настроя haystack с 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) и да го регистрирате с модела. Вижте този раздел от документацията за инструкции и пример.

Бих задал този въпрос и в django-haystack Google Group, тъй като авторът и други потребители на haystack ще го видят там и са склонни да бъдат изключително полезни.

person John Debs    schedule 29.12.2009
comment
Благодаря! всъщност го накарах да работи, като заобиколих напълно search_indexes.py и просто поставих всичко в search_sites.py. Все още се опитвам да проследя точния проблем, след което определено ще го публикувам тук. Благодаря отново за нашата помощ! - person Keith Fitzgerald; 29.12.2009

Току-що срещнах същото съобщение TypeError с напълно различен стек.

Търсенето на цялото съобщение за грешка доведе до два резултата: този въпрос и изходния код за import.c на Python. Така че след малко ровене установявам, че тази конкретна грешка се причинява, когато на вградения __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 прави низовете/unicode по различен начин.

person Romløk    schedule 21.04.2010
comment
Страхотна работа! Попаднах на това по случаен начин, както и вие... търсене в SO за този низ за грешка извежда само този въпрос. Прехвърлянето на моя unicode като str работи прекрасно. - person Adam Wagner; 20.12.2011
comment
Едва не ми скубе косата тази вечер от същия този проблем с импортирането на unicode - БЛАГОДАРЯ, гласувайте за! - person eCaroth; 24.01.2012

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

След като коментирах този ред във всеки от файловете за миграция на tastypie, моите миграции се изпълняват добре.

Това, което намирам за озадачаващо, е фактът, че миграциите на tastypie преминаха добре вчера с новата версия на tastypie (в отделен проект, който споделя същия virtualenv). Това е мистерия за друг ден.

person Ngure Nyaga    schedule 08.08.2013

Снощи се сблъсках със същата грешка в кодова база, която работеше преди 5 минути без каквато и да е модификация. Докато минах през моето git repo, кодът, който работеше преди, причиняваше същата грешка. Прехвърлих своята 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