【问题标题】:PyYAML with Python 3.xPyYAML 与 Python 3.x
【发布时间】:2016-03-17 08:27:10
【问题描述】:

我在 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 可以正常工作。

任何想法/建议如何让它发挥作用?

【问题讨论】:

  • 你是如何安装 PyYAML 的?点子?设置.py?压缩包?你是用 sudo 权限安装的吗?
  • 您的回溯暗示您实际上拥有旧版本的 PyYAML,因为 from error import * 不是绝对导入(正如您所说的 PyYAML 3.11 使用)。
  • 您安装了 2.x 并从 PyYAML 3.11 获得了 2.x 版本的源代码,如果您使用 3.x 安装,您将安装不同的源代码。
  • 谢谢,好像是这个问题。

标签: python python-3.x pyyaml


【解决方案1】:

您似乎要么使用旧版本的PyYAML,要么使用PyYAML 的Python2 安装和other answer 中建议的Python3,因为在您的回溯中我们看到

from error import *

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

【讨论】:

  • 它不是旧版本,它是 3.11 的 2.x 源,已经安装并重复使用。有关 PyYAML 中两个不同顶级 __init__.py 文件的链接,请参阅我的答案
  • @Anthon 我会被诅咒的,我什至没有想到。随意对此投反对票,或者我应该编辑或删除。
  • 还有:这有多脑残?为什么不像您所做的那样,将源代码与兼容助手和未来导入合并。
  • 我实际上将 PyYAML 2.x 和 3.x 源合并为我为 ruamel.yaml 做的第一件事之一,但我没有立即意识到这一点 %-) 。您的答案可能仍然是正确的(尽管长期以来,PyYAML 中没有任何更改/修复,OP 不太可能有旧版本。我不会反对。如果您愿意,可以将我的答案称为(更多) 可能导致 OPs 问题。
  • 实际上有一个公开的PR for the merge 来自我,但由于对此没有反应,我只是继续前进,不想对两个源库提出进一步的更改。恕我直言,这是正确的做法,因为 PyYAML 的开发似乎已经停滞。
【解决方案2】:

您的环境被污染了。如果您创建一个(临时)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.x3.x 安装,PyYAML 源实际上是不同的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多