PyYAML 与 Python 3.x

PyYAML with Python 3.x

我在 Python 3.x 中使用 yaml (PyYAML 3.11) 库时遇到问题。当我调用 import yaml 时出现以下错误:

Python 3.4.3+ (default, Oct 14 2015, 16:03:50) 
[GCC 5.2.1 20151010] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import yaml
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/mlohr/python-libs/yaml/__init__.py", line 2, in <module>
    from error import *
ImportError: No module named 'error'

error 是一个位于 yaml 目录中的文件,但是来自 yaml 的 __init__.py 确实使用了绝对导入。我想这就是问题所在,但我不确定。

http://pyyaml.org/wiki/PyYAMLDocumentation#Python3support 中是关于(假设)Python 3 支持的短路径,所以我不确定我是否使用错误的方式。

将 Python 3 与使用 yaml 的 python 脚本一起使用时,会出现同样的问题(这就是我发现问题的方式)。

在 Python 2.7 和 2.6 中可以正常工作。

任何 idea/suggestion 如何让它工作?

您似乎要么使用旧版本的 PyYAML,要么使用 PyYAML 安装的 PyYAML 和 Python3,如,因为在你的回溯中我们看到

from error import *

这不是绝对导入。您应该升级,在您的环境中使用 Python3 个源重新安装 PyYAML,或者为 Python3 个包创建一个新环境。

您的环境被污染了。如果你创建一个(临时的)virtualenv,这没有问题:

$ mktmpenv -p /opt/python/3.4/bin/python
Running virtualenv with interpreter /opt/python/3.4/bin/python
Using base prefix '/opt/python/3.4'
New python executable in /home/venv/tmp-504ff2573d39ad0c/bin/python
Installing setuptools, pip, wheel...done.
This is a temporary environment. It will be deleted when you run 'deactivate'.
(tmp-504ff2573d39ad0c) $ pip install pyyaml
Collecting pyyaml
Installing collected packages: pyyaml
Successfully installed pyyaml-3.11
(tmp-504ff2573d39ad0c) $ python
Python 3.4.3 (default, Jun  5 2015, 09:05:22) 
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import yaml
>>> 

最可能的原因是您重新使用了为 Python 2.X 安装的 YAML。 2.x and 3.x 安装的 PyYAML 源实际上是不同的。

解决此问题的最简单方法是安装和使用 ruamel.yaml(免责声明:我是该软件包的作者),这是对 PyYAML 的升级,其中的源再次重新组合。