极简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
相关产品推荐
相关产品推荐

