我对以下问题感到困惑。我有一台 Mac M3,具有以下特点。
我有Python 3.12.6。我一直在尝试安装 pyo (https://pypi.org/project/pyo/1.0.1/)。在标题位置出现许多问题之后,我可以使用以下命令解决所有“我找不到 blablaheader.h”:
pip3 install --global-option='build_ext' --global-option='-I/opt/homebrew/Cellar/portaudio/19.7.0/include’ --global-option='-L/opt/homebrew/Cellar/portaudio/19.7.0/lib’ pyo==1.0.1
但是现在我出现了以下错误,非常令人费解。它看起来像是扩展上的 C 错误语法?
clang -fno-strict-overflow -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -O3 -Wall -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX14.sdk -I/opt/homebrew/include/ -I/opt/homebrew/Cellar/unixodbc/2.3.12/include -DUSE_PORTAUDIO -DUSE_PORTMIDI -DUSE_OSC -Iinclude -I/usr/include -I/usr/local/include -I/opt/local/include -I/Users/alejandro/projects/generate-music/venv/include -I/opt/homebrew/opt/[email protected]/Frameworks/Python.framework/Versions/3.12/include/python3.12 -c src/objects/bandsplitmodule.c -o build/temp.macosx-14.0-arm64-cpython-312/src/objects/bandsplitmodule.o -Wno-strict-prototypes -Wno-strict-aliasing -O3 -g0 -DNDEBUG
src/objects/bandsplitmodule.c:1639:8: error: expected '(' after 'if'
if PyList_Check(arg) {
^
/opt/homebrew/opt/[email protected]/Frameworks/Python.framework/Versions/3.12/include/python3.12/listobject.h:25:5: note: expanded from macro 'PyList_Check'
PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_LIST_SUBCLASS)
^
/opt/homebrew/opt/[email protected]/Frameworks/Python.framework/Versions/3.12/include/python3.12/object.h:971:41: note: expanded from macro 'PyType_FastSubclass'
#define PyType_FastSubclass(type, flag) PyType_HasFeature((type), (flag))
^
1 error generated.
error: command '/usr/bin/clang' failed with exit code 1
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed building wheel for pyo
Failed to build pyo
我真的怀疑扩展程序有这种错误,所以很可能是 C 版本问题。也许是C++,而我的系统只有C编译器?我不知道。
我真的需要一些“方向”。
答案是扩展确实有问题。更具体地说,它有一个语法错误。
pyo
的作者在 if 语句的条件表达式中省略了括号,这在 C 中是不允许的。据推测,之前版本的 libpython
定义了 PyList_Check(...)
宏,其中的括号已被删除那么。
最简单的解决方案是安装较新版本的
pyo
,该版本已更正语法错误; 1.0.4 似乎是纠正了语法错误的最旧版本。 1.0.5 是最新版本。
如果你绝对必须使用1.0.1版本,那么你应该编写一个补丁。执行此操作的步骤如下: