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

极简setup.py示例运行时setuptools抛出TypeError错误

setuptools执行极简setup.py抛出TypeError的解决方案

问题背景

使用如下极简setup.py执行python setup.py命令时,触发TypeError: expected string or bytes-like object错误,已尝试卸载重装setuptools无效。

极简setup.py代码

from setuptools import setup
setup(
    name="packagename"
)

完整报错栈

Traceback (most recent call last):
  File "setup.py", line 2, in <module>
    setup(
  File "/home/user/anaconda3/lib/python3.8/site-packages/setuptools/__init__.py", line 86, in setup
    _install_setup_requires(attrs)
  File "/home/user/anaconda3/lib/python3.8/site-packages/setuptools/__init__.py", line 75, in _install_setup_requires
    dist = MinimalDistribution(attrs)
  File "/home/user/anaconda3/lib/python3.8/site-packages/setuptools/__init__.py", line 57, in __init__
    super().__init__(filtered)
  File "/home/user/anaconda3/lib/python3.8/site-packages/setuptools/dist.py", line 474, in __init__
    for ep in metadata.entry_points(group='distutils.setup_keywords'):
  File "/home/user/anaconda3/lib/python3.8/site-packages/setuptools/_vendor/importlib_metadata/__init__.py", line 999, in entry_points
    return SelectableGroups.load(eps).select(**params)
  File "/home/user/anaconda3/lib/python3.8/site-packages/setuptools/_vendor/importlib_metadata/__init__.py", line 449, in load
    ordered = sorted(eps, key=by_group)
  File "/home/user/anaconda3/lib/python3.8/site-packages/setuptools/_vendor/importlib_metadata/__init__.py", line 996, in <genexpr>
    eps = itertools.chain.from_iterable(
  File "/home/user/anaconda3/lib/python3.8/site-packages/setuptools/_vendor/importlib_metadata/_itertools.py", line 16, in unique_everseen
    k = key(element)
  File "/home/user/anaconda3/lib/python3.8/site-packages/setuptools/_vendor/importlib_metadata/__init__.py", line 931, in _normalized_name
    return self._name_from_stem(stem) or super()._normalized_name
  File "/home/user/anaconda3/lib/python3.8/site-packages/setuptools/_vendor/importlib_metadata/__init__.py", line 600, in _normalized_name
    return Prepared.normalize(self.name)
  File "/home/user/anaconda3/lib/python3.8/site-packages/setuptools/_vendor/importlib_metadata/__init__.py", line 855, in normalize
    return re.sub(r"[-_.]+", "-", name).lower().replace('-', '_')
  File "/home/user/anaconda3/lib/python3.8/re.py", line 210, in sub
    return _compile(pattern, flags).sub(repl, string, count)
TypeError: expected string or bytes-like object

环境信息

  • Python 3.8.13
  • setuptools 65.4.1

问题分析

报错发生在importlib_metadata的normalize方法中,代码尝试对非字符串类型的name字段执行正则替换。核心原因是系统中某个已安装包的entry points配置存在错误,导致name字段不是合法的字符串类型,触发类型异常。


解决方案

1. 定位异常包

执行以下命令遍历所有包的entry points,找出触发错误的包:

python -c "
from importlib_metadata import distributions
for dist in distributions():
    try:
        eps = dist.entry_points
        for ep in eps:
            if ep.group == 'distutils.setup_keywords':
                print(f'Package: {dist.name}, Entry Point Name: {repr(ep.name)}, Value: {ep.value}')
    except Exception as e:
        print(f'Error with package {dist.name}: {e}')
"

输出中标记为错误的包就是问题根源。

2. 修复或卸载异常包

  • 若该包非必需,直接卸载:
    pip uninstall <异常包名称>
    
  • 若该包是必需的,尝试重新安装或切换到兼容版本:
    pip install --force-reinstall <异常包名称>
    # 或指定版本
    pip install <异常包名称>==<兼容版本号>
    

3. 降级setuptools版本

若上述方法无效,可尝试降级setuptools到与Python3.8兼容性更稳定的版本:

pip install setuptools==60.2.0

4. 虚拟环境隔离测试

如果全局环境存在依赖冲突,创建虚拟环境重新测试:

# 创建虚拟环境
python -m venv myenv
# 激活虚拟环境(Linux/macOS)
source myenv/bin/activate
# 激活虚拟环境(Windows)
myenv\Scripts\activate
# 安装指定版本setuptools
pip install setuptools==65.4.1
# 运行setup.py
python setup.py

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 18:15:51