嗯,我正在玩 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 文件。这是为什么?
如果另一个名为 yaml.py 的文件位于实际 PyYaml 库之前的 sys.path 上,您将选择并导入该 yaml.py 文件。 这包括您是否将自己的文件命名为 yaml.py。
您在目录中获得 yaml.pyc 的事实表明这正是您正在做的事情。 您的 import yaml 语句正在加载到您自己的 yaml.py 文件中,这会导致解释器将其编译为 yaml.pyc 以提高运行效率。
重命名目录中的 yaml.py 文件。 作为一般规则,不要将您正在处理的任何 Python 文件命名为与您正在使用的任何现有 Python 模块相同的名称。
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']
@michaelfilms 的回答对我有帮助。
我将我的测试文件命名为
yaml.py
并通过 import yaml
导入 PyYAML,因此它在源头考虑自身。我将我的文件重命名为test_yaml.py
。我必须将导入更新为
import yaml
而不是自动更新
import test_yaml
,现在一切正常。
在 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 实例,请谨慎操作。