You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker-Compose构建失败:AttributeError: cython_sources问题排查

Django-React站点Docker构建失败:AttributeError: cython_sources 问题排查与解决

我正在构建一个Django-React站点,明明没修改依赖或镜像版本,Docker-Compose突然无法完成构建。我的requirements.txt依赖如下:

Django>=3.2.4,<4.0
djangorestframework>=3.12.4,<3.14.0
djangorestframework-simplejwt>=4.8.0,<5.3.0
psycopg2>=2.8.6,<2.9
drf-spectacular>=0.15.1,<0.30
django-allauth>0.5,<1.0
dj-rest-auth>=3.0,<4.0

构建时出现AttributeError: cython_sources错误。移除drf-spectacular后构建能成功,但手动添加pyyaml==5.4.1仍无法解决问题。此前相同版本的依赖可正常构建,现在突然失效,具体原因及解决方法如下:

添加PyYAML后的错误日志:

Collecting Django<4.0,>=3.2.4 (from -r /tmp/requirements.txt (line 1))
23.17   Obtaining dependency information for Django<4.0,>=3.2.4 from https://files.pythonhosted.org/packages/84/eb/5329ae72bf26b91844985d0de74e4edf876e3ca409d085820f230eea2eba/Django-3.2.20-py3-none-any.whl.metadata
23.32   Downloading Django-3.2.20-py3-none-any.whl.metadata (4.1 kB)
23.37 Collecting djangorestframework<3.14.0,>=3.12.4 (from -r /tmp/requirements.txt (line 2))
23.39   Downloading djangorestframework-3.13.1-py3-none-any.whl (958 kB)
23.54      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 958.3/958.3 kB 6.8 MB/s eta 0:00:00
23.57 Collecting djangorestframework-simplejwt<5.3.0,>=4.8.0 (from -r /tmp/requirements.txt (line 3))
23.60   Downloading djangorestframework_simplejwt-5.2.2-py3-none-any.whl (85 kB)
23.61      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 85.4/85.4 kB 9.6 MB/s eta 0:00:00
23.68 Collecting psycopg2<2.9,>=2.8.6 (from -r /tmp/requirements.txt (line 4))
23.71   Downloading psycopg2-2.8.6.tar.gz (383 kB)
23.76      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 383.8/383.8 kB 7.9 MB/s eta 0:00:00
23.80   Installing build dependencies: started
25.10   Installing build dependencies: finished with status 'done'
25.10   Getting requirements to build wheel: started
25.23   Getting requirements to build wheel: finished with status 'done'
25.23   Preparing metadata (pyproject.toml): started
25.36   Preparing metadata (pyproject.toml): finished with status 'done'
25.46 Collecting pyyaml==5.4.1 (from -r /tmp/requirements.txt (line 5))
25.48   Downloading PyYAML-5.4.1.tar.gz (175 kB)
25.50      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 175.1/175.1 kB 7.7 MB/s eta 0:00:00
25.60   Installing build dependencies: started
27.95   Installing build dependencies: finished with status 'done'
27.95   Getting requirements to build wheel: started
28.12   Getting requirements to build wheel: finished with status 'error'
28.12   error: subprocess-exited-with-error
28.12
28.12   × Getting requirements to build wheel did not run successfully.
28.12   │ exit code: 1
28.12   ╰─&gt; [62 lines of output]
28.12       /tmp/pip-build-env-m9dhhrb5/overlay/lib/python3.9/site-packages/setuptools/config/setupcfg.py:293: _DeprecatedConfig: Deprecated config in `setup.cfg`
28.12       !!
28.12
28.12               ********************************************************************************
28.12               The license_file parameter is deprecated, use license_files instead.
28.12
28.12               By 2023-Oct-30, you need to update your project and remove deprecated calls
28.12               or your builds will no longer be supported.
28.12
28.12               See https://setuptools.pypa.io/en/latest/userguide/declarative_config.html for details.
28.12               ********************************************************************************
28.12
28.12       !!
28.12         parsed = self.parsers.get(option_name, lambda x: x)(value)
28.12       running egg_info
28.12       writing lib3/PyYAML.egg-info/PKG-INFO
28.12       writing dependency_links to lib3/PyYAML.egg-info/dependency_links.txt
28.12       writing top-level names to lib3/PyYAML.egg-info/top_level.txt
28.12       Traceback (most recent call last):
28.12         File "/py/lib/python3.9/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 353, in <module>
28.12           main()
28.12         File "/py/lib/python3.9/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 335, in main
28.12           json_out['return_val'] = hook(**hook_input['kwargs'])
28.12         File "/py/lib/python3.9/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 118, in get_requires_for_build_wheel
28.12           return hook(config_settings)
28.12         File "/tmp/pip-build-env-m9dhhrb5/overlay/lib/python3.9/site-packages/setuptools/build_meta.py", line 341, in get_requires_for_build_wheel
28.12           return self._get_build_requires(config_settings, requirements=['wheel'])
28.12         File "/tmp/pip-build-env-m9dhhrb5/overlay/lib/python3.9/site-packages/setuptools/build_meta.py", line 323, in _get_build_requires
28.12           self.run_setup()
28.12         File "/tmp/pip-build-env-m9dhhrb5/overlay/lib/python3.9/site-packages/setuptools/build_meta.py", line 338, in run_setup
28.12           exec(code, locals())
28.12         File "<string>", line 271, in <module>
28.12         File "/tmp/pip-build-env-m9dhhrb5/overlay/lib/python3.9/site-packages/setuptools/__init__.py", line 107, in setup
28.12           return distutils.core.setup(**attrs)
28.12         File "/tmp/pip-build-env-m9dhhrb5/overlay/lib/python3.9/site-packages/setuptools/_distutils/core.py", line 185, in setup
28.12           return run_commands(dist)
28.12         File "/tmp/pip-build-env-m9dhhrb5/overlay/lib/python3.9/site-packages/setuptools/_distutils/core.py", line 201, in run_commands
28.12           dist.run_commands()
28.12         File "/tmp/pip-build-env-m9dhhrb5/overlay/lib/python3.9/site-packages/setuptools/_distutils/dist.py", line 969, in run_commands
28.12           self.run_command(cmd)
28.12         File "/tmp/pip-build-env-m9dhhrb5/overlay/lib/python3.9/site-packages/setuptools/dist.py", line 1234, in run_command
28.12           super().run_command(command)
28.12         File "/tmp/pip-build-env-m9dhhrb5/overlay/lib/python3.9/site-packages/setuptools/_distutils/dist.py", line 988, in run_command
28.12           cmd_obj.run()
28.12         File "/tmp/pip-build-env-m9dhhrb5/overlay/lib/python3.9/site-packages/setuptools/command/egg_info.py", line 314, in run
28.12           self.find_sources()
28.12         File "/tmp/pip-build-env-m9dhhrb5/overlay/lib/python3.9/site-packages/setuptools/command/egg_info.py", line 322, in find_sources
28.12           mm.run()
28.12         File "/tmp/pip-build-env-m9dhhrb5/overlay/lib/python3.9/site-packages/setuptools/command/egg_info.py", line 551, in run
28.12           self.add_defaults()
28.12         File "/tmp/pip-build-env-m9dhhrb5/overlay/lib/python3.9/site-packages/setuptools/command/egg_info.py", line 589, in add_defaults
28.12           sdist.add_defaults(self)
28.12         File "/tmp/pip-build-env-m9dhhrb5/overlay/lib/python3.9/site-packages/setuptools/command/sdist.py", line 104, in add_defaults
28.12           super().add_defaults()
28.12         File "/tmp/pip-build-env-m9dhhrb5/overlay/lib/python3.9/site-packages/setuptools/_distutils/command/sdist.py", line 251, in add_defaults
28.12           self._add_defaults_ext()
28.12         File "/tmp/pip-build-env-m9dhhrb5/overlay/lib/python3.9/site-packages/setuptools/_distutils/command/sdist.py", line 336, in _add_defaults_ext
28.12           self.filelist.extend(build_ext.get_source_files())
28.12         File "<string>", line 201, in get_source_files
28.12         File "/tmp/pip-build-env-m9dhhrb5/overlay/lib/python3.9/site-packages/setuptools/_distutils/cmd.py", line 107, in __getattr__
28.12           raise AttributeError(attr)
28.12       AttributeError: cython_sources
28.12       [end of output]
28.12
28.12   note: This error originates from a subprocess, and is likely not a problem with pip.
28.13 error: subprocess-exited-with-error
28.13
28.13 × Getting requirements to build wheel did not run successfully.
28.13 │ exit code: 1
28.13 ╰─&gt; See above for output.

问题原因

核心矛盾是旧版本PyYAML(5.4.1)与新版setuptools不兼容。Docker构建时会自动拉取最新版的构建依赖(比如setuptools、pip),即便你没修改自己的requirements,新版setuptools发布后,其内部API发生变化(移除了cython_sources属性),而旧版PyYAML的构建脚本仍在调用这个属性,导致报错。

drf-spectacular本身依赖PyYAML,所以移除它后冲突消失;但手动添加旧版PyYAML时,同样会触发这个兼容性问题。

解决方法

  • 升级PyYAML到兼容版本:将requirements中的pyyaml==5.4.1替换为pyyaml>=6.0,或者直接去掉版本限制,让pip自动选择兼容新版setuptools的版本。这是最稳妥的长期解决方案。
  • 固定setuptools版本:在requirements.txt开头添加setuptools<60.0,强制使用旧版setuptools来避免兼容性冲突。不过这种方法只是临时 workaround,不推荐长期使用,还是升级依赖更可靠。
  • 使用预编译wheel包:在Docker镜像中安装PyYAML时,添加--only-binary :all:参数,避免从源码编译,比如执行pip install --only-binary :all: pyyaml==5.4.1。但这个方法受平台限制,部分环境可能无法找到对应的预编译包。

内容的提问来源于stack exchange,提问作者Marco Sousa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 03:05:54