pyYAML - 错误 - 属性错误:没有属性“load”

问题描述 投票:0回答:4

嗯,我正在玩 pyYAML。我使用 Windows 安装程序安装了 Python 2.7 版本。

它导入得很好:

import yaml

并且它不会抛出任何错误。

但是,如果我这样做:

import yaml

f = open("sets.yml")
dataMap = yaml.load(f)
f.close()

print dataMap

它抛出属性错误并表示“模块”对象没有属性“加载”。

我尝试转储,得到了同样的结果。像这样导入也是同样的事情:

from yaml import load

大家有什么想法吗?

哦,而且,我觉得这很奇怪——每当我运行脚本时,它都会创建一个 .pyc 文件。这是为什么?

python pyyaml
4个回答
20
投票

如果另一个名为 yaml.py 的文件位于实际 PyYaml 库之前的 sys.path 上,您将选择并导入该 yaml.py 文件。 这包括您是否将自己的文件命名为 yaml.py。

您在目录中获得 yaml.pyc 的事实表明这正是您正在做的事情。 您的 import yaml 语句正在加载到您自己的 yaml.py 文件中,这会导致解释器将其编译为 yaml.pyc 以提高运行效率。

重命名目录中的 yaml.py 文件。 作为一般规则,不要将您正在处理的任何 Python 文件命名为与您正在使用的任何现有 Python 模块相同的名称。


1
投票

PyYAML-3.10 有 load():

jcomeau@intrepid:/usr/src/clusterFix$ easy_install pyyaml
Searching for pyyaml
Reading http://pypi.python.org/simple/pyyaml/
Reading http://pyyaml.org/wiki/PyYAML
Best match: PyYAML 3.10
Downloading http://pyyaml.org/download/pyyaml/PyYAML-3.10.zip
Processing PyYAML-3.10.zip
Running PyYAML-3.10/setup.py -q bdist_egg --dist-dir /tmp/easy_install-2PnFkZ/PyYAML-3.10/egg-dist-tmp-kCMq7S
build/temp.linux-i686-2.6/check_libyaml.c:2:18: fatal error: yaml.h: No such file or directory
compilation terminated.

libyaml is not found or a compiler error: forcing --without-libyaml
(if libyaml is installed correctly, you may need to
 specify the option --include-dirs or uncomment and
 modify the parameter include_dirs in setup.cfg)
zip_safe flag not set; analyzing archive contents...
Adding PyYAML 3.10 to easy-install.pth file

Installed /usr/local/lib/python2.6/dist-packages/PyYAML-3.10-py2.6-linux-i686.egg
Processing dependencies for pyyaml
Finished processing dependencies for pyyaml
jcomeau@intrepid:/usr/src/clusterFix$ python
Python 2.6.7 (r267:88850, Jun 13 2011, 22:03:32) 
[GCC 4.6.1 20110608 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import yaml
>>> dir(yaml)
['AliasEvent', 'AliasToken', 'AnchorToken', 'BaseDumper', 'BaseLoader', 'BlockEndToken', 'BlockEntryToken', 'BlockMappingStartToken', 'BlockSequenceStartToken', 'CollectionEndEvent', 'CollectionNode', 'CollectionStartEvent', 'DirectiveToken', 'DocumentEndEvent', 'DocumentEndToken', 'DocumentStartEvent', 'DocumentStartToken', 'Dumper', 'Event', 'FlowEntryToken', 'FlowMappingEndToken', 'FlowMappingStartToken', 'FlowSequenceEndToken', 'FlowSequenceStartToken', 'KeyToken', 'Loader', 'MappingEndEvent', 'MappingNode', 'MappingStartEvent', 'Mark', 'MarkedYAMLError', 'Node', 'NodeEvent', 'SafeDumper', 'SafeLoader', 'ScalarEvent', 'ScalarNode', 'ScalarToken', 'SequenceEndEvent', 'SequenceNode', 'SequenceStartEvent', 'StreamEndEvent', 'StreamEndToken', 'StreamStartEvent', 'StreamStartToken', 'TagToken', 'Token', 'ValueToken', 'YAMLError', 'YAMLObject', 'YAMLObjectMetaclass', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', '__version__', '__with_libyaml__', 'add_constructor', 'add_implicit_resolver', 'add_multi_constructor', 'add_multi_representer', 'add_path_resolver', 'add_representer', 'compose', 'compose_all', 'composer', 'constructor', 'dump', 'dump_all', 'dumper', 'emit', 'emitter', 'error', 'events', 'load', 'load_all', 'loader', 'nodes', 'parse', 'parser', 'reader', 'representer', 'resolver', 'safe_dump', 'safe_dump_all', 'safe_load', 'safe_load_all', 'scan', 'scanner', 'serialize', 'serialize_all', 'serializer', 'tokens']

1
投票

@michaelfilms 的回答对我有帮助。

我将我的测试文件命名为

yaml.py
并通过
import yaml
导入 PyYAML,因此它在源头考虑自身。我将我的文件重命名为test_yaml.py

我必须将导入更新为

import yaml

 而不是自动更新 
import test_yaml
,现在一切正常。


0
投票

在 MacOS 上

我的错误是具体的

AttributeError: module 'yaml' has no attribute 'safe_load'

pip

没有帮助

python3 -m pip install pyyaml
输出

Requirement already satisfied: pyyaml in /opt/homebrew/lib/python3.12/site-packages (6.0.1)

解决方案对我有用

brew install pyyaml ==> Downloading https://formulae.brew.sh/api/formula.jws.json ########################################################################################################################### 100.0% ==> Downloading https://formulae.brew.sh/api/cask.jws.json ########################################################################################################################### 100.0% Warning: pyyaml 6.0.1_1 is already installed, it's just not linked. To link this version, run: brew link pyyaml
所以我就这么做了

brew link --overwrite pyyaml
(对于我来说,

--overwrite

是必要的)。

如果您有多个 python / ruby 实例,请谨慎操作。

© www.soinside.com 2019 - 2024. All rights reserved.