为什么`from ruamel.yaml import CSafeDumper`在python3.11上执行时抛出导入错误?

drnojrws  于 2023-10-17  发布在  Python
关注(0)|答案(1)|浏览(228)

创建一个包含以下内容的test.py

import sys
print(sys.version)
from importlib.metadata import version
print(f"ruamel.yaml version {version('ruamel.yaml')}") 

from ruamel.yaml import CSafeDumper

在上运行python3.11 test.py将生成

3.11.3 (main, Apr  5 2023, 14:14:37) [GCC 11.3.0]
ruamel.yaml version 0.17.22
Traceback (most recent call last):
  File "/home/victory/test.py", line 6, in <module>
    from ruamel.yaml import CSafeDumper
ImportError: cannot import name 'CSafeDumper' from 'ruamel.yaml' (/home/victory/venv_3.11/lib/python3.11/site-packages/ruamel/yaml/__init__.py)

python3.10 test.py返回

3.10.6 (main, Mar 10 2023, 10:55:28) [GCC 11.3.0]
ruamel.yaml version 0.17.22

我不知道这是一个bug,还是在最新的python版本中ruamel.yaml发生了一些变化。https://pypi.org/project/ruamel.yaml/0.17.22/没有提到任何关于这一点,据我所知。

polhcujo

polhcujo1#

从GCC 11.3.0开始,我假设您在Linux上运行。您没有描述您是如何安装的,但看起来您只安装了ruamel.yaml,而没有安装ruamel.yaml.clibCSafeDumper需要安装ruamel.yaml.clib才能激活。
对于Python 3.10,ruamel.yaml.clib的安装是自动的,但对于Python 3.11,它不是(它将在ruamel.yaml的下一个版本中)。
在运行Ubuntu 22.04的机器上,在新创建的virtualenv中:

➜ ~ /opt/util/rytest2/bin/python -m pip list               
Package          Version
---------------- -------
pip              22.3.1
ruamel.yaml      0.17.22
ruamel.yaml.clib 0.2.7
setuptools       65.5.0
➜ ~ /opt/util/rytest2/bin/python            
Python 3.11.3 (main, Apr 13 2023, 08:44:49) [GCC 11.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from ruamel.yaml import CSafeDumper
>>> print(CSafeLoader)
<class 'ruamel.yaml.cyaml.CSafeDumper'>
>>>

所以只要显式安装ruamel.yaml.clib就可以了。

相关问题