PyICU работает в оболочке Django, но не на веб-сервере

Я получаю эту ошибку при попытке получить доступ к атрибуту Collator ICU на промежуточном сервере.

AttributeError at /...
'module' object has no attribute 'Collator'

При запуске оболочки Django и выполнении точно такого же кода все кажется работающим так же хорошо, как и локально. Код, который вызывает ошибку:

import icu
    collator = icu.Collator.createInstance(icu.Locale(get_language()))
    objects = [i for i in sorted(objects, key=attrgetter('city'), cmp=collator.compare)]

Я успешно установил ICU (libicu52, libicu-dev) через PHP5 PPA от Ondrej, а также PyICU, как локально, так и на нашем промежуточном сервере. Сервер под управлением Ubuntu Server 13.10 с Python 2.7.5, Django 1.5.5, Nginx 1.4.1 и uWSGI 1.9.13.

Вот полный трекбек:

File "/var/www/venv/site/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  115.                         response = callback(request, *callback_args, **callback_kwargs)
File "/var/www/venv/site/local/lib/python2.7/site-packages/django/views/generic/base.py" in view
  68.             return self.dispatch(request, *args, **kwargs)
File "/var/www/venv/site/local/lib/python2.7/site-packages/django/views/generic/base.py" in dispatch
  86.         return handler(request, *args, **kwargs)
File "/var/www/.../pages/views.py" in get
  48.             return StoreListView.as_view(object=self.object)(request)
File "/var/www/venv/site/local/lib/python2.7/site-packages/django/views/generic/base.py" in view
  68.             return self.dispatch(request, *args, **kwargs)
File "/var/www/venv/site/local/lib/python2.7/site-packages/django/views/generic/base.py" in dispatch
  86.         return handler(request, *args, **kwargs)
File "/var/www/venv/site/local/lib/python2.7/site-packages/django/views/generic/list.py" in get
  124.         self.object_list = self.get_queryset()
File "/var/www/.../geosearch/views.py" in get_queryset
  22.             objects = self.sort_objects(objects)
File "/var/www/.../geosearch/views.py" in sort_objects
  59.         collator = icu.Collator.createInstance(icu.Locale(get_language()))

Exception Type: AttributeError at /...
Exception Value: 'module' object has no attribute 'Collator'

Мне удалось распечатать ICU __dict__, но это дает мне ICUError. Локально, ICU возвращается с его фактическими атрибутами, включая Collator.

ICUError=<class 'icu.ICUError'>,
__builtins__={'bytearray': <type 'bytearray'>,
'IndexError': <type 'exceptions.IndexError'>
[...]

В чем может быть причина того, что код работает должным образом в оболочке Django, а не через веб-сервер?

1 ответ

Решение

Это оказалось неверной конфигурацией в uWSGI и не имело ничего общего с PyICU или ICU. Я понял, что uWSGI не использует пакеты, установленные в virtualenv, поэтому я взглянул в конфигурационный файл uWSGI еще раз.

chdir не была установлена ​​правильная папка, вместо этого она указала на свою родительскую папку.

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

Другие вопросы по тегам