【问题标题】:Django Sass Compressor django_libsass.SassCompiler: command not foundDjango Sass Compressor django_libsass.SassCompiler:找不到命令
【发布时间】:2014-04-26 06:33:44
【问题描述】:

我正在使用 Django-Compressor Filter 作为 Wagtail 的一部分(具有超酷 UI 的 Django 变体 CMS)。环境是 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

skeleton.html的第20行是:

    <!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 libsassngm install lesscpip 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

根据 gasman 的评论,我运行了 python manage.py shell 并尝试导入 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'

【问题讨论】:

  • 如果您在manage.py shell 内运行from django_libsass import SassCompiler,会收到什么错误消息(如果有)?
  • 我试过了,没有出现任何错误。我认为错误在 SassCompiler 中的 sass.compile 行中出现。担心我的 sass 在 Kevin 的回复后没有正确安装,并让我的主机重新安装它 & cython & libsass & compass。还尝试了gem install sass,它给了我一个带有 sass 的 ruby​​ 文件夹。在此之前,我的站点包文件夹中有一个 sass.so。
  • @gasman,如果有帮助的话,我实际上开始了我的 wagtail 安装过程的整个 blog 编年史。我的大部分错误都在那里详细列出
  • OK - 新错误'module' object has no attribute 'compile' 与您最初报告的错误不同,因此您的设置似乎发生了一些变化:它现在已成功找到 django_libsass,但看起来导入错误'sass'这个名字的东西。请尝试卸载除 libsass 和 django-libsass 之外的所有与 sass 相关的 Python 包。如果这没有任何区别,请在 manage.py shell 中运行 import sass; sass 并让我知道输出内容。
  • 加斯曼!有效!我爱你!

标签: python django python-2.7 django-compressor wagtail


【解决方案1】:

(根据要求重新发布我的 cmets 作为答案...)

原错误:django_libsass.SassCompiler: command not found

意味着它无法导入 django-libsass 库。 (django-compressor 通过尝试将其视为 shell 命令来响应该故障 - django_libsass 不是可运行的命令,所以这也失败了,给出了此处看到的实际错误。)解决方案是确保安装 django-libsass - 它应该出现在pip freeze 的输出中。

第二个错误:'module' object has no attribute 'compile'

意味着安装了另一个包,它定义了一个名为 sass 的模块,并且正在从 libsass 包中加载它来代替我们想要的模块。解决方案是卸载除 django-libsass 和 libsass 之外的所有 sass 相关包。

【讨论】:

  • 只是补充:django-libsass 可能已正确安装,但在运行时出现错误需要修复。在我的情况下,它已过时且与 Django 3 不兼容。在django_libsass.SassCompiler: command not found 上方的堆栈跟踪中查找错误并尝试先解决此问题。
【解决方案2】:

我的 Python-Django 项目和 rvm 遇到了同样的问题。问题是压缩预编译器不知道要使用哪个 rvm。解决方法是在environ中添加ruby路径,并告诉预编译器在settings.py文件中哪里可以找到sass:

就像我的情况一样(只需执行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}'),
 )

希望这对某人有所帮助。

【讨论】:

    【解决方案3】:

    错误

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

    表示 Django Compressor 正在尝试将 django_libsass.SassCompiler 作为 shell 命令运行,并且脚本无法运行。

    这是因为django_libsass.SassCompiler 不是可以从命令行运行的有效程序。

    如果您还没有安装 sass,最好先安装 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 将 分别使用标准输入和标准输出。

    【讨论】:

    • 奇怪,我检查过我可以导入sass,所以它在路径上。尝试更改代码并获取 /bin/sh: sass: command not found 这意味着它仍在尝试作为 shell 命令?
    • 这里有两个路径在起作用——$PYTHONPATH,它决定了你导入时python搜索的目录,以及$PATH,它决定了可以从命令行运行什么。 sass 程序不是 python 库——它是一个可以在您的开发机器上运行的独立程序。如果您在命令行上键入sass,您将看到找不到该命令。使用sass-lang.com/install 的说明安装 sass,或者让您的系统管理员这样做。
    • "...表示 Django Compressor 正在尝试将 django_libsass.SassCompiler 作为 shell 命令运行,并且脚本无法运行。" - 这是一条红鲱鱼。 Django-compressor 首先尝试将字符串解释为 python 模块,如果失败(显然它在这里所做的),它会退回将其视为 shell 命令。不需要安装命令行 Sass 工具来使用 Wagtail - django-libsass 库应该完全在 Python 端处理它。 (我们一直在努力减少 Wagtail 的非 Python 依赖...)
    【解决方案4】:

    pip install django_pyscss 将解决您的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-12
      • 2012-12-16
      • 1970-01-01
      • 2012-01-05
      • 2018-12-09
      • 2012-08-01
      • 2022-10-19
      • 1970-01-01
      相关资源
      最近更新 更多