无法使用pyyaml加载CLoader

时间:2017-12-08 13:41:05

标签: python pyyaml

我正在使用pyyaml处理python项目。我需要在基于bitnami / minideb:jessie的Docker容器中运行它。 Python版本是2.7.9。 原始代码使用的是CLoader,我目前无法更改它。 任何原因CLoader无法加载但Loader很好吗?

>>> import yaml
>>> yaml.__version__
'3.12'
>>> from yaml import Loader
>>> from yaml import CLoader
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: cannot import name CLoader
>>>

我无法弄清楚我在这里缺少什么。有什么想法吗?

从Docker镜像python:2.7.9运行它不会引发任何错误:

$ docker run -ti python:2.7.9 bash
#/ python
>>> from yaml import CLoader
>>> from yaml import Loader
>>>

5 个答案:

答案 0 :(得分:2)

默认情况下,setup.py脚本检查是否已安装LibYAML 如果是这样,则构建并安装LibYAML绑定。

这是编译和安装CLoader的最低要求。

FROM ubuntu:20.04
RUN apt-get update && apt-get install -y \
    python3 python3-dev python3-pip gcc libyaml-dev
RUN pip3 install pyyaml
# verify
RUN python3 -c "import yaml; yaml.CLoader"

答案 1 :(得分:1)

我遇到了同样的问题。您需要安装libyaml-dev软件包,然后从源代码安装libyaml和pyyaml。这是Dockerfile的完整minideb:jessie

FROM bitnami/minideb:jessie

RUN apt-get update
RUN apt-get install -y \
        automake \
        autoconf \
        build-essential \
        git-core \
        libtool \
        libyaml-dev \
        make \
        python \
        python-dev \
        python-pip

RUN pip install --upgrade pip
RUN pip install Cython==0.29.10

RUN mkdir /libyaml
WORKDIR /libyaml
RUN git clone https://github.com/yaml/libyaml.git . && \
    git checkout dist-0.2.2 && \
    autoreconf -f -i && \
    ./configure && \
    make && \
    make install

RUN mkdir /pyyaml
WORKDIR /pyyaml
RUN git clone https://github.com/yaml/pyyaml.git . && \
    git checkout 5.1.1 && \
    python setup.py install

RUN python -c "import yaml; from yaml import CLoader; print 'Loaded CLoader!'"

答案 2 :(得分:1)

对其他人的解决方案的补充:

如果您希望在libyaml C扩展无法构建的情况下install命令硬失败(而不是默默地退回到纯Python的安装方式),则可以传递--with-libyaml全局选项,例如:python setup.py --with-libyaml install

如果您执行的操作可能需要升级(例如,通过另一个软件包对更高的pyyaml版本的要求隐式进行),则最好使用pip而不是直接调用setup.py ,因为(当前)使用的是纯distutils安装,该pip稍后将无法卸载。您会看到类似“错误:无法卸载'PyYAML'的错误。这是一个distutils安装的项目,因此我们无法准确确定属于该文件的哪些文件,这只会导致部分卸载。”

使用pip进行所需的扩展程序构建看起来像pip install --global-option='--with-libyaml' pyyaml

答案 3 :(得分:0)

我只是从上面链接的issue复制开发人员的答案,但这是因为pyyaml仅在找到libyaml-dev软件包(即debian软件包)时才安装libyaml绑定(CLoader&co。)。 ,无论如何)。如果找不到,它将打印警告并跳过libyaml绑定。

因此,在安装pyyaml之前先安装libyaml-dev。

答案 4 :(得分:0)

我尝试了所有提到的步骤,以下步骤解决了我的问题。

安装

class ImageAttachment < Attachment
  def self.default_scope
   where('attachments.attachment LIKE ?', '%png') }
  end

  rails_admin do
    configure :attachment do
      view = bindings[:view]
      attachment  = bindings[:object]

      if view
        view.content_tag(:img, attachment.attachment.url)
      else
        ''
      end
    end

    list do 
      field :attachment
    end
  end
end

测试

apt-get install -y gcc libyaml-dev
pip install --ignore-installed --global-option='--with-libyaml' pyyaml