Django Sass Compressor django_libsass.SassCompiler: команда не найдена

Я использую фильтр Django-Compressor как часть Wagtail (вариант CMS Django с очень крутым пользовательским интерфейсом). Среда: Wagtail 0.2 + Python 2.7 + Django 1.6 + Virtualenv + FastCGI + виртуальный хостинг Apache.

Проблема возникает при попытке доступа к странице администратора/логина CMS. Django показывает шаблон рендеринга ошибок

    Error during template rendering

In template /home/username/env/lib/python2.7/site-packages/wagtail/wagtailadmin/templates/wagtailadmin/skeleton.html, error at line 20
/bin/sh: django_libsass.SassCompiler: command not found

Строка 20 скелета.html:

    <!doctype html>
    {% load compress %}
    <!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"  lang="{{ LANGUAGE_CODE|default:"en-gb" }}"> <![endif]-->
    <!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"  lang="{{ LANGUAGE_CODE|default:"en-gb" }}"> <![endif]-->
    <!--[if IE 8]>         <html class="no-js lt-ie9"  lang="{{ LANGUAGE_CODE|default:"en-gb" }}"> <![endif]-->
    <!--[if gt IE 8]><!--> <html class="no-js"  lang="{{ LANGUAGE_CODE|default:"en-gb" }}"> <!--<![endif]-->
        <title>Wagtail - {% block titletag %}{% endblock %}</title>
        <meta name="description" content="" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />

        <script src="//cdnjs.cloudflare.com/ajax/libs/modernizr/2.6.2/modernizr.min.js"></script>

        {% block css %}{# Block defined for timing breakdowns in django debug toolbar - not expected to be overridden #}
            <link rel="stylesheet" href="//fonts.googleapis.com/css?family=Open+Sans:300,400,600,700" />
            <link rel="stylesheet" href="//fonts.googleapis.com/css?family=Bitter:400,700" /> 
19          
20          {% compress css %}
21              <link rel="stylesheet" href="{{ STATIC_URL }}wagtailadmin/scss/normalize.css" />
                <link rel="stylesheet" href="{{ STATIC_URL }}wagtailadmin/scss/vendor/jquery-ui/jquery-ui-1.10.3.verdant.css" />
                <link rel="stylesheet" href="{{ STATIC_URL }}wagtailadmin/scss/vendor/jquery.timepicker.css" />
                <link rel="stylesheet" href="{{ STATIC_URL }}wagtailadmin/scss/core.scss" type="text/x-scss" />
            {% endcompress %}

            {% block extra_css %}{% endblock %}
        {% endblock %}
    </head>
    <body class="{% block bodyclass %}{% endblock %} {% if messages %}has-messages{% endif %}">

прекомпилятор в моем settings.py, DEBUG имеет значение True:

COMPRESS_ENABLED = True

COMPRESS_PRECOMPILERS = ( 
     ('text/x-scss', 'django_libsass.SassCompiler'), 
)

ПРОБЫ И ОШИБКИ №1

Я пытался изменить на:

('text/x-scss', '/home/username/env/lib/python2.7/site-packages/django_libsass {infile} {outfile}')

но это приводит меня к ошибке элемента последовательности обновления словаря № 0.

У меня установлены django_libsass и компрессор, также пробовал pip install libsass, ngm install lessc, pip install sass, переворачивая DEBUG = False, добавляя COMPRESSOR_OFFLINE, добавляя COMPRESSOR_ENABLED, как предлагалось в других подобных вопросах. Выполнение manage.py compress возвращает ту же ошибку.

Перепроверил, и сайт-пакеты и django_libsass действительно находятся на моем sys.path

SassCompiler можно найти в ~/env/lib/python2.7/site-packages/django_libsass.py

ПРОБЫ И ОШИБКИ №2

Перепроверил, что sass установлен и на моем пути.

Измените код на:

COMPRESS_PRECOMPILERS = ( 
     ('text/x-scss', 'sass --scss {infile} {outfile}'), 
 )

Возвращает ошибку:

Exception Type: FilterError
Exception Value:    
/bin/sh: sass: command not found

ПРОБЫ И ОШИБКИ №3

После прочтения этого feedly issue попробовал pip install compass безрезультатно.

ПРОБЫ И ОШИБКИ №4

После комментария газовщика я запустил оболочку python manage.py и попытался импортировать SassCompiler. Он работает без ошибок.

 Python 2.7.6 (default, Nov 11 2013, 18:34:29) 
    [GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    (InteractiveConsole)
    >>> from django_libsass import SassCompiler
    >>> 

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

Я прошу прощения, если этот вопрос становится слишком длинным.

Traceback:
File "/home/username/env/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  139.                 response = response.render()
File "/home/username/env/lib/python2.7/site-packages/django/template/response.py" in render
  105.             self.content = self.rendered_content
File "/home/username/env/lib/python2.7/site-packages/django/template/response.py" in rendered_content
  82.         content = template.render(context)
File "/home/username/env/lib/python2.7/site-packages/django/template/base.py" in render
  140.             return self._render(context)
File "/home/username/env/lib/python2.7/site-packages/django/template/base.py" in _render
  134.         return self.nodelist.render(context)
File "/home/username/env/lib/python2.7/site-packages/django/template/base.py" in render
  840.                 bit = self.render_node(node, context)
File "/home/username/env/lib/python2.7/site-packages/django/template/debug.py" in render_node
  78.             return node.render(context)
File "/home/username/env/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  123.         return compiled_parent._render(context)
File "/home/username/env/lib/python2.7/site-packages/django/template/base.py" in _render
  134.         return self.nodelist.render(context)
File "/home/username/env/lib/python2.7/site-packages/django/template/base.py" in render
  840.                 bit = self.render_node(node, context)
File "/home/username/env/lib/python2.7/site-packages/django/template/debug.py" in render_node
  78.             return node.render(context)
File "/home/username/env/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  62.             result = block.nodelist.render(context)
File "/home/username/env/lib/python2.7/site-packages/django/template/base.py" in render
  840.                 bit = self.render_node(node, context)
File "/home/username/env/lib/python2.7/site-packages/django/template/debug.py" in render_node
  78.             return node.render(context)
File "/home/username/env/lib/python2.7/site-packages/compressor/templatetags/compress.py" in render
  147.         return self.render_compressed(context, self.kind, self.mode, forced=forced)
File "/home/username/env/lib/python2.7/site-packages/compressor/templatetags/compress.py" in render_compressed
  107.             rendered_output = self.render_output(compressor, mode, forced=forced)
File "/home/username/env/lib/python2.7/site-packages/compressor/templatetags/compress.py" in render_output
  119.         return compressor.output(mode, forced=forced)
File "/home/username/env/lib/python2.7/site-packages/compressor/css.py" in output
  51.                     ret.append(subnode.output(*args, **kwargs))
File "/home/username/env/lib/python2.7/site-packages/compressor/css.py" in output
  53.         return super(CssCompressor, self).output(*args, **kwargs)
File "/home/username/env/lib/python2.7/site-packages/compressor/base.py" in output
  246.         content = self.filter_input(forced)
File "/home/username/env/lib/python2.7/site-packages/compressor/base.py" in filter_input
  194.         for hunk in self.hunks(forced):
File "/home/username/env/lib/python2.7/site-packages/compressor/base.py" in hunks
  169.                 precompiled, value = self.precompile(value, **options)
File "/home/username/env/lib/python2.7/site-packages/compressor/base.py" in precompile
  226.                                 **kwargs)
File "/home/username/env/lib/python2.7/site-packages/django_libsass.py" in input
  51.             return compile(filename=self.filename)
File "/home/username/env/lib/python2.7/site-packages/django_libsass.py" in compile
  41.     return sass.compile(**kwargs)

Exception Type: AttributeError at /admin/login/
Exception Value: 'module' object has no attribute 'compile'

person moshushi    schedule 19.03.2014    source источник
comment
Какое сообщение об ошибке (если есть) вы получите, если запустите from django_libsass import SassCompiler в manage.py shell?   -  person gasman    schedule 22.03.2014
comment
Я попробовал это и не получил никаких ошибок. Я думаю, что ошибка возникает в SassCompiler в строке sass.compile. Обеспокоился, что мой sass не был правильно установлен после ответа Кевина, и мой хостинг переустановил его, cython, libsass и компас. Также попробовал gem install sass, который дает мне рубиновую папку с sass. До этого у меня был sass.so в папке с пакетами сайтов.   -  person moshushi    schedule 22.03.2014
comment
@gasman, если это поможет, я фактически начал целую блог о процессе установки моей трясогузки. там подробно расписано большинство моих ошибок   -  person moshushi    schedule 22.03.2014
comment
ОК, новая ошибка 'module' object has no attribute 'compile' отличается от той, о которой вы сообщали изначально, поэтому похоже, что что-то изменилось в вашей настройке: теперь она успешно находит django_libsass, но похоже, что она импортирует не то, что нужно для имени «sass». Попробуйте удалить все пакеты Python, связанные с sass, кроме libsass и django-libsass. Если это не имеет никакого значения, пожалуйста, запустите import sass; sass внутри manage.py shell и дайте мне знать, что говорит вывод.   -  person gasman    schedule 23.03.2014
comment
газовщик! это сработало! Я тебя люблю!   -  person moshushi    schedule 23.03.2014
comment
если говорить более серьезно, если вы опубликуете ответ как ответ, я поставлю его как принятый ответ. Что произошло, так это то, что я удалил все остальное, как вы сказали, и import sass; sass указывал на sass.pyc, но все равно выдавал ту же ошибку атрибута. Удаление всех файлов .pyc, связанных с sass, решило эту проблему, и я впервые вижу страницу входа!   -  person moshushi    schedule 23.03.2014
comment
Однако я изменил одну вещь, чтобы удалить ошибку /bin/sh: django_libsass.SassCompiler, которую я получал. Я поставил shell = False в base.py надежде Compressor Filter, что это не вызовет проблем в будущем   -  person moshushi    schedule 23.03.2014
comment
Хорошо, ответил! shell = False не должно иметь значения... теперь, когда django-libsass правильно установлен, эта строка кода (надеюсь) никогда не запустится.   -  person gasman    schedule 24.03.2014
comment
Теперь я составил вики-страницу с подробным описанием шагов, которые нужно предпринять при возникновении этой ошибки: github. com/torchbox/django-libsass/wiki/Устранение неполадок   -  person gasman    schedule 12.08.2015


Ответы (4)


(Репост моих комментариев в качестве ответа, как и просили...)

Исходная ошибка: django_libsass.SassCompiler: command not found

означало, что ему не удалось импортировать библиотеку django-libsass. (django-compressor отреагировал на этот сбой, попытавшись вместо этого обработать его как команду оболочки - django_libsass не является исполняемой командой, поэтому это тоже не удалось, выдавая фактическую ошибку, показанную здесь.) Решение состоит в том, чтобы убедиться, что django-libsass установлен - он должен отображаться в выводе pip freeze.

Вторая ошибка: 'module' object has no attribute 'compile'

означало, что был установлен другой пакет, определяющий модуль с именем sass, и он загружался вместо того, который мы хотели, из пакета libsass. Решение состоит в том, чтобы удалить все пакеты, связанные с sass, кроме django-libsass и libsass.

person gasman    schedule 24.03.2014
comment
Просто дополнение: django-libsass мог быть установлен правильно, но во время выполнения возникла ошибка, которую необходимо исправить. В моем случае он устарел и несовместим с Django 3. Найдите ошибку в трассировке стека выше django_libsass.SassCompiler: command not found и попытайтесь сначала исправить ее. - person Andy; 18.02.2020

У меня была такая же проблема с моим проектом Python-Django и rvm. Проблема в том, что прекомпилятор сжатия не знает, какой rvm использовать. Решение состоит в том, чтобы добавить ruby-путь в среду и сообщить прекомпилятору, где найти sass в файле settings.py:

Как и в моем случае (просто выполните which sass, чтобы найти путь):

 environ['PATH'] = '/Users/username/.rvm/gems/ruby-2.1.5/bin:/Users/username/.rvm/gems/ruby-2.1.5@global/bin:/Users/username/.rvm/rubies/ruby-2.1.5/bin:Users/username/bin'

 COMPRESS_PRECOMPILERS = (
 ('text/x-scss', '/Users/username/.rvm/gems/ruby-2.1.5/bin/sass --scss --trace {infile} {outfile}'),
 )

Надеюсь, что это кому-то поможет.

person Slim Advies    schedule 25.02.2015

Ошибка

/bin/sh: django_libsass.SassCompiler: command not found

Указывает, что Django Compressor пытается запустить django_libsass.SassCompiler как команду оболочки, но сценарий не запускается.

Это потому, что django_libsass.SassCompiler недопустимая программа, которую можно запустить из командной строки.

Лучше всего сначала установить sass, если вы еще этого не сделали, следуя инструкциям на этой странице: http://sass-lang.com/install

Затем измените свой код на:

 COMPRESS_PRECOMPILERS = ( 
     ('text/x-scss', 'sass --scss {infile} {outfile}'), 
 )

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

Из документов (http://django-compressor.readthedocs.org/en/latest/settings/#django.conf.settings.COMPRESS_PRECOMPILERS), вторая часть вашего кортежа:

Команда для вызова каждого из файлов. Современное форматирование строк Python будет предоставлено для двух заполнителей {infile} и {outfile}, наличие которых в командной строке также запускает фактическое создание этих временных файлов. Если это не указано в командной строке, Django Compressor будет использовать стандартный ввод и стандартный вывод соответственно.

person Kevin Mooney    schedule 19.03.2014
comment
странно, я проверил, что могу импортировать sass, так что он находится на пути. Пытался изменить код и получить /bin/sh: sass: command not found, что означает, что он все еще пытается использовать команду оболочки? - person moshushi; 20.03.2014
comment
Здесь работают два пути: $PYTHONPATH, который определяет каталоги, которые python ищет при импорте, и $PATH, который определяет, что можно запустить из командной строки. Программа sass не является библиотекой Python — это отдельная программа, которую можно запустить на вашем компьютере для разработки. Если вы находитесь в командной строке и набираете sass, вы увидите, что команда не найдена. Либо установите sass, следуя инструкциям на странице sass-lang.com/install, либо попросите сделать это вашего системного администратора. - person Kevin Mooney; 20.03.2014
comment
...Указывает, что Django Compressor пытается запустить django_libsass.SassCompiler как команду оболочки, и сценарий не запускается. - Это отвлекающий маневр. Django-compressor сначала пытается интерпретировать строку как модуль Python, и если это не удается (как, по-видимому, это происходит здесь), он возвращается к обработке ее как команды оболочки. Для использования Wagtail не нужно устанавливать инструмент командной строки Sass — библиотека django-libsass должна полностью обрабатывать его на стороне Python. (Мы много работали, чтобы свести к минимуму не-Python-зависимости для Wagtail...) - person gasman; 22.03.2014

pip install django_pyscss решит вашу проблему.

person alin.calinciuc    schedule 24.10.2016