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

Използвам Django-Compressor Filter като част от 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 на skeleton.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="/bg//fonts.googleapis.com/css?family=Open+Sans:300,400,600,700" />
            <link rel="stylesheet" href="/bg//fonts.googleapis.com/css?family=Bitter:400,700" /> 
19          
20          {% compress css %}
21              <link rel="stylesheet" href="/bg{{ STATIC_URL }}wagtailadmin/scss/normalize.css" />
                <link rel="stylesheet" href="/bg{{ STATIC_URL }}wagtailadmin/scss/vendor/jquery-ui/jquery-ui-1.10.3.verdant.css" />
                <link rel="stylesheet" href="/bg{{ STATIC_URL }}wagtailadmin/scss/vendor/jquery.timepicker.css" />
                <link rel="stylesheet" href="/bg{{ 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, опитах pip install compass без ефект

ОПИТ И ГРЕШКА #4

След коментара на gasman стартирах обвивката на 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 & compass. Опитах също gem install sass, което ми дава ruby ​​папка с sass. Преди това имах sass.so в моята папка site-packages.   -  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, но все още даваше същата грешка на атрибута. Изтриването на всички свързани с sass .pyc файлове реши това и виждам страницата за влизане за първи път!   -  person moshushi    schedule 23.03.2014
comment
Промених обаче едно нещо, за да премахна грешката /bin/sh: django_libsass.SassCompiler, която получавах. Сложих shell = False в base.py на компресорния филтър, надявам се, че това няма да създаде проблеми по-нататък   -  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 ​​към environ и да кажете на прекомпилатора къде да намери 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 ще използва съответно stdin и stdout вместо това.

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 и ако това не успее (както очевидно се прави тук), той се връща към третирането му като команда на обвивката. Не би трябвало да е необходимо да инсталирате инструмент Sass от командния ред, за да използвате Wagtail - библиотеката django-libsass трябва да го обработва изцяло от страна на Python. (Работихме усилено, за да сведем до минимум зависимостите, различни от Python, за Wagtail...) - person gasman; 22.03.2014

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

person alin.calinciuc    schedule 24.10.2016