[BUG] PGL安装脚本中错误地修改 __builtins__ 导致安装失败
描述
问题现象
在Python 3.11+环境中安装PGL时,执行到 setup.py 中的 finalize_options 函数会报以下错误:
AttributeError: 'dict' object has no attribute '__NUMPY_SETUP__'
复现步骤
- 环境:Python 3.11.4, NumPy 1.26.4
- 执行
pip install pgl
问题定位
问题出在 setup.py 的 finalize_options 函数中:
def finalize_options(self):
_build_ext.finalize_options(self)
# Prevent numpy from thinking it is still in its setup process:
__builtins__.__NUMPY_SETUP__ = False # ← 问题行
import numpy
self.include_dirs.append(numpy.get_include())
根本原因
__builtins__ 在不同上下文中行为不同:
- 在主模块中:
__builtins__ 指向 builtins 模块本身(可添加属性)
- 在非主模块中(如被导入的模块或安装脚本):
__builtins__ 指向 builtins.__dict__(字典,不可添加属性)
安装脚本运行在非主模块环境下,因此 __builtins__ 是一个字典,不能通过 __builtins__.xxx = yyy 的方式添加属性。
影响范围
- Python 3.0+ 所有版本(因为这个问题从Python 3.0开始就存在)
- 任何通过
pip install pgl 安装PGL的用户
解决方案
建议修复
将问题行改为使用正确的 builtins 模块导入:
def finalize_options(self):
_build_ext.finalize_options(self)
# Prevent numpy from thinking it is still in its setup process:
import builtins
builtins.__NUMPY_SETUP__ = False # ✅ 正确的方式
import numpy
self.include_dirs.append(numpy.get_include())
或者直接删除
由于新版本NumPy已经不再需要 __NUMPY_SETUP__ 标志,也可以直接删除这行代码:
def finalize_options(self):
_build_ext.finalize_options(self)
import numpy
self.include_dirs.append(numpy.get_include())
环境信息
- Python版本: 3.11.4
- 操作系统: Windows
- PGL版本: 最新版
- NumPy版本: 1.26.4
[BUG] PGL安装脚本中错误地修改
__builtins__导致安装失败描述
问题现象
在Python 3.11+环境中安装PGL时,执行到
setup.py中的finalize_options函数会报以下错误:复现步骤
pip install pgl问题定位
问题出在
setup.py的finalize_options函数中:根本原因
__builtins__在不同上下文中行为不同:__builtins__指向builtins模块本身(可添加属性)__builtins__指向builtins.__dict__(字典,不可添加属性)安装脚本运行在非主模块环境下,因此
__builtins__是一个字典,不能通过__builtins__.xxx = yyy的方式添加属性。影响范围
pip install pgl安装PGL的用户解决方案
建议修复
将问题行改为使用正确的
builtins模块导入:或者直接删除
由于新版本NumPy已经不再需要
__NUMPY_SETUP__标志,也可以直接删除这行代码:环境信息