我正在使用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
>>>
答案 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