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 ╰─> [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 ╰─> 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
相关产品推荐
相关产品推荐

