Setuptools构建setuptools-rust时生成UNKNOWN.egg而非目标包问题求助
问题描述
使用Python 3.10.4、OpenSSL 3.0和setuptools v58.2构建setuptools-rust(v1.3)时出现以下异常:
- 执行命令
python cayman_pyo3_setuptools-rust/pyo3_setuptools-rust/src/setup.py build,仅输出running build,无后续构建动作 - 执行install命令后,生成
UNKNOWN-0.0.0-py3.10.egg文件,同时提示无Python模块可安装;解压该egg文件,仅包含EGG-INFO相关文件,无实际代码模块
相关配置文件
setup.py
#!/usr/bin/env python from setuptools import setup if __name__ == "__main__": setup()
pyproject.toml
[build-system] requires = ["setuptools>=58.0", "setuptools_scm[toml]>=3.4.3"] build-backend = "setuptools.build_meta" [tool.setuptools_scm] write_to = "setuptools_rust/version.py" [tool.isort] profile = "black" [tool.pytest.ini_options] minversion = "6.0" addopts = "--doctest-modules"
setup.cfg
[metadata] name = setuptools-rust version = attr: setuptools_rust.__version__ author = Nikolay Kim author_email = fafhrd91@gmail.com license = MIT description = Setuptools Rust extension plugin keywords = distutils, setuptools, rust url = https://github.com/PyO3/setuptools-rust long_description = file: README.md long_description_content_type = text/markdown classifiers = Topic :: Software Development :: Version Control License :: OSI Approved :: MIT License Intended Audience :: Developers Programming Language :: Python :: 3 Programming Language :: Python :: 3.6 Programming Language :: Python :: 3.7 Programming Language :: Python :: 3.8 Programming Language :: Python :: 3.9 Development Status :: 5 - Production/Stable Operating System :: POSIX Operating System :: MacOS :: MacOS X Operating System :: Microsoft :: Windows [options] packages = setuptools_rust zip_safe = True install_requires = setuptools>=58.0; semantic_version>=2.8.2,<3; typing_extensions>=3.7.4.3 setup_requires = setuptools>=58.0; setuptools_scm>=6.3.2 python_requires = >=3.7 [options.entry_points] distutils.commands = clean_rust=setuptools_rust:clean_rust build_rust=setuptools_rust:build_rust distutils.setup_keywords = rust_extensions=setuptools_rust.setuptools_ext:rust_extensions
问题原因及解决方案
核心原因
- setuptools_scm版本生成失败:配置依赖setuptools_scm从Git仓库生成版本号并写入
setuptools_rust/version.py,但如果代码未处于Git仓库中、无有效标签/提交记录,setuptools_scm无法生成该文件。setup.cfg中版本配置为attr: setuptools_rust.__version__,无法获取版本号时,setuptools会默认使用UNKNOWN-0.0.0作为包标识。 - 包目录未被正确识别:setup.cfg指定
packages = setuptools_rust,但如果执行命令时工作目录不正确,或者setuptools_rust目录不存在于setup.py同级路径下(或缺少__init__.py文件),setuptools无法找到要打包的Python模块,最终生成的egg仅包含元数据文件。
解决方案
修复版本生成问题:
- 临时方案:修改setup.cfg的
[metadata]段,将version = attr: setuptools_rust.__version__替换为固定版本号,如version = 1.3 - 长期方案:确保代码处于Git仓库中,添加符合规范的版本标签(如
v1.3),让setuptools_scm自动生成version.py
- 临时方案:修改setup.cfg的
确保包目录可被识别:
- 切换到setup.py所在目录执行命令:
cd cayman_pyo3_setuptools-rust/pyo3_setuptools-rust/src && python setup.py build - 确认
setuptools_rust目录存在于setup.py同级路径下,且目录内包含__init__.py(可创建空文件)
- 切换到setup.py所在目录执行命令:
检查命令执行路径:
若无法切换工作目录,可使用Python的-C参数指定工作目录:python -C cayman_pyo3_setuptools-rust/pyo3_setuptools-rust/src setup.py build
内容的提问来源于stack exchange,提问作者Abhinav Bandaru
相关产品推荐
相关产品推荐

