PyType_Type和PyBaseObject_Type

本文详细解析了Python中PyType_Type(类型类型)与PyBaseObject_Type(对象基类)的概念,包括它们在C语言实现中的静态变量、类型对象的创建与关系,以及object作为所有类型基石的重要性。

PyObject和PyTypeObject内容的最后指出下图中对实例对象类型对象的理解是不完全正确的,
Alt
浮点类型对象全局唯一,Python在C语言层面实现过程中将其定义为一个全局静态变量,定义于Object/floatobject.c中,命名为PyFloat_Type

PyTypeObject PyFloat_Type = {
   
   
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
    "float",
    sizeof(PyFloatObject),
    0,
    (destructor)float_dealloc,                  /* tp_dealloc */

    // ...
    (reprfunc)float_repr,                       /* tp_repr */

    // ...
};
  • 第2行使用初始化ob_refcntob_type以及ob_size三个字段,PyVarObject_HEAD_INIT的定义可以参考博文1.4.3节的内容。
  • 第3行将tp_name字段初始化成类型名称"float"
  • 再往下是各种操作的函数指针

ob_type指针指向PyType_Type,这也是一个静态定义的全局变量。代表“类型的类型” 的type对象就是PyType_Type

一. 类型的类型—PyType_Tpye(type的实体)

上文中,float类型对象在底层实现过程中对应PyFloat_Type全局静态变量。Python类型是一种对象,也有自己的类型,即Python中的type。

>>> 
error: subprocess-exited-with-error × Building wheel for PyQt5-sip (pyproject.toml) did not run successfully. │ exit code: 1 ╰─> [183 lines of output] running bdist_wheel running build running build_ext building 'PyQt5.sip' extension creating build creating build\temp.win32-cpython-37 creating build\temp.win32-cpython-37\Release "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\bin\HostX86\x86\cl.exe" /c /nologo /O2 /W3 /GL /DNDEBUG /MD -Ic:\users\lry20\anaconda3\include -Ic:\users\lry20\anaconda3\Include "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\ATLMFC\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.26100.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\shared" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\winrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\ATLMFC\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.26100.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\shared" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\winrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" /Tcapiversions.c /Fobuild\temp.win32-cpython-37\Release\apiversions.obj apiversions.c "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\bin\HostX86\x86\cl.exe" /c /nologo /O2 /W3 /GL /DNDEBUG /MD -Ic:\users\lry20\anaconda3\include -Ic:\users\lry20\anaconda3\Include "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\ATLMFC\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.26100.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\shared" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\winrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\ATLMFC\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.26100.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\shared" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\winrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" /EHsc /Tpbool.cpp /Fobuild\temp.win32-cpython-37\Release\bool.obj bool.cpp "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\bin\HostX86\x86\cl.exe" /c /nologo /O2 /W3 /GL /DNDEBUG /MD -Ic:\users\lry20\anaconda3\include -Ic:\users\lry20\anaconda3\Include "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\ATLMFC\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.26100.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\shared" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\winrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\ATLMFC\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.26100.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\shared" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\winrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" /EHsc /Tcdescriptors.c /Fobuild\temp.win32-cpython-37\Release\descriptors.obj descriptors.c "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\bin\HostX86\x86\cl.exe" /c /nologo /O2 /W3 /GL /DNDEBUG /MD -Ic:\users\lry20\anaconda3\include -Ic:\users\lry20\anaconda3\Include "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\ATLMFC\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.26100.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\shared" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\winrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\ATLMFC\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.26100.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\shared" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\winrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" /EHsc /Tcint_convertors.c /Fobuild\temp.win32-cpython-37\Release\int_convertors.obj int_convertors.c "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\bin\HostX86\x86\cl.exe" /c /nologo /O2 /W3 /GL /DNDEBUG /MD -Ic:\users\lry20\anaconda3\include -Ic:\users\lry20\anaconda3\Include "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\ATLMFC\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.26100.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\shared" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\winrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\ATLMFC\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.26100.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\shared" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\winrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" /EHsc /Tcobjmap.c /Fobuild\temp.win32-cpython-37\Release\objmap.obj objmap.c "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\bin\HostX86\x86\cl.exe" /c /nologo /O2 /W3 /GL /DNDEBUG /MD -Ic:\users\lry20\anaconda3\include -Ic:\users\lry20\anaconda3\Include "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\ATLMFC\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.26100.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\shared" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\winrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\ATLMFC\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.26100.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\shared" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\winrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" /EHsc /Tcqtlib.c /Fobuild\temp.win32-cpython-37\Release\qtlib.obj qtlib.c "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\bin\HostX86\x86\cl.exe" /c /nologo /O2 /W3 /GL /DNDEBUG /MD -Ic:\users\lry20\anaconda3\include -Ic:\users\lry20\anaconda3\Include "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\ATLMFC\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.26100.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\shared" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\winrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\ATLMFC\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.26100.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\shared" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\winrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" /EHsc /Tcsip_array.c /Fobuild\temp.win32-cpython-37\Release\sip_array.obj sip_array.c sip_array.c(322): warning C4090: “=”: 不同的“const”限定符 "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\bin\HostX86\x86\cl.exe" /c /nologo /O2 /W3 /GL /DNDEBUG /MD -Ic:\users\lry20\anaconda3\include -Ic:\users\lry20\anaconda3\Include "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\ATLMFC\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.26100.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\shared" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\winrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\ATLMFC\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.26100.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\shared" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\winrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" /EHsc /Tcsiplib.c /Fobuild\temp.win32-cpython-37\Release\siplib.obj siplib.c siplib.c(2901): warning C4013: “sipSetBool”未定义;假设外部返回 int siplib.c(3905): warning C4133: “=”: 从“PyObject *”到“sipSimpleWrapper *”的类型不兼容 "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\bin\HostX86\x86\cl.exe" /c /nologo /O2 /W3 /GL /DNDEBUG /MD -Ic:\users\lry20\anaconda3\include -Ic:\users\lry20\anaconda3\Include "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\ATLMFC\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.26100.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\shared" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\winrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\ATLMFC\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.26100.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\shared" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\winrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" /EHsc /Tcthreads.c /Fobuild\temp.win32-cpython-37\Release\threads.obj threads.c "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\bin\HostX86\x86\cl.exe" /c /nologo /O2 /W3 /GL /DNDEBUG /MD -Ic:\users\lry20\anaconda3\include -Ic:\users\lry20\anaconda3\Include "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\ATLMFC\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.26100.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\shared" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\winrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\ATLMFC\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.26100.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\shared" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\winrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" /EHsc /Tcvoidptr.c /Fobuild\temp.win32-cpython-37\Release\voidptr.obj voidptr.c creating C:\Users\lry20\AppData\Local\Temp\pip-install-wdl9123w\pyqt5-sip_4745936b3ac44c20b3a11492581697fb\build\lib.win32-cpython-37 creating C:\Users\lry20\AppData\Local\Temp\pip-install-wdl9123w\pyqt5-sip_4745936b3ac44c20b3a11492581697fb\build\lib.win32-cpython-37\PyQt5 "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\bin\HostX86\x86\link.exe" /nologo /INCREMENTAL:NO /LTCG /DLL /MANIFEST:EMBED,ID=2 /MANIFESTUAC:NO /LIBPATH:c:\users\lry20\anaconda3\libs /LIBPATH:c:\users\lry20\anaconda3 /LIBPATH:c:\users\lry20\anaconda3\PCbuild\win32 "/LIBPATH:C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\ATLMFC\lib\x86" "/LIBPATH:C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\lib\x86" "/LIBPATH:C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\lib\um\x86" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.26100.0\ucrt\x86" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\\lib\10.0.26100.0\\um\x86" "/LIBPATH:C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\ATLMFC\lib\x86" "/LIBPATH:C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\lib\x86" "/LIBPATH:C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\lib\um\x86" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.26100.0\ucrt\x86" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\\lib\10.0.26100.0\\um\x86" /EXPORT:PyInit_sip build\temp.win32-cpython-37\Release\apiversions.obj build\temp.win32-cpython-37\Release\bool.obj build\temp.win32-cpython-37\Release\descriptors.obj build\temp.win32-cpython-37\Release\int_convertors.obj build\temp.win32-cpython-37\Release\objmap.obj build\temp.win32-cpython-37\Release\qtlib.obj build\temp.win32-cpython-37\Release\sip_array.obj build\temp.win32-cpython-37\Release\siplib.obj build\temp.win32-cpython-37\Release\threads.obj build\temp.win32-cpython-37\Release\voidptr.obj /OUT:build\lib.win32-cpython-37\PyQt5\sip.cp37-win_amd64.pyd /IMPLIB:build\temp.win32-cpython-37\Release\sip.cp37-win_amd64.lib 正在创建库 build\temp.win32-cpython-37\Release\sip.cp37-win_amd64.lib 对象 build\temp.win32-cpython-37\Release\sip.cp37-win_amd64.exp apiversions.obj : error LNK2001: 无法解析的外部符号 __imp__PyLong_FromLong apiversions.obj : error LNK2001: 无法解析的外部符号 __imp___Py_NoneStruct apiversions.obj : error LNK2001: 无法解析的外部符号 __imp__PyDict_SetItemString apiversions.obj : error LNK2001: 无法解析的外部符号 __imp__PyExc_ValueError apiversions.obj : error LNK2001: 无法解析的外部符号 __imp__PyErr_Format apiversions.obj : error LNK2001: 无法解析的外部符号 __imp___PyArg_ParseTuple_SizeT apiversions.obj : error LNK2001: 无法解析的外部符号 __imp__PyCFunction_NewEx descriptors.obj : error LNK2001: 无法解析的外部符号 __imp__PyObject_GC_UnTrack descriptors.obj : error LNK2001: 无法解析的外部符号 __imp__PyObject_GetAttr descriptors.obj : error LNK2001: 无法解析的外部符号 __imp__PyExc_AttributeError descriptors.obj : error LNK2001: 无法解析的外部符号 __imp__PyUnicode_FromFormat descriptors.obj : error LNK2001: 无法解析的外部符号 __imp__PyType_GenericAlloc int_convertors.obj : error LNK2001: 无法解析的外部符号 __imp__PyLong_AsUnsignedLong int_convertors.obj : error LNK2001: 无法解析的外部符号 __imp__PyErr_Occurred int_convertors.obj : error LNK2001: 无法解析的外部符号 __imp__PyLong_AsUnsignedLongLong int_convertors.obj : error LNK2001: 无法解析的外部符号 __imp__PyLong_AsLongLong int_convertors.obj : error LNK2001: 无法解析的外部符号 __imp__PyLong_AsUnsignedLongLongMask int_convertors.obj : error LNK2001: 无法解析的外部符号 __imp___Py_FalseStruct int_convertors.obj : error LNK2001: 无法解析的外部符号 __imp__PyExc_OverflowError int_convertors.obj : error LNK2001: 无法解析的外部符号 __imp__PyLong_AsUnsignedLongMask int_convertors.obj : error LNK2001: 无法解析的外部符号 __imp__PyErr_ExceptionMatches int_convertors.obj : error LNK2001: 无法解析的外部符号 __imp__PyErr_Clear int_convertors.obj : error LNK2001: 无法解析的外部符号 __imp__PyExc_TypeError int_convertors.obj : error LNK2001: 无法解析的外部符号 __imp___Py_TrueStruct objmap.obj : error LNK2001: 无法解析的外部符号 __imp__PyType_IsSubtype qtlib.obj : error LNK2001: 无法解析的外部符号 __imp__PyCFunction_Type qtlib.obj : error LNK2001: 无法解析的外部符号 __imp__PyWeakref_NewRef qtlib.obj : error LNK2001: 无法解析的外部符号 __imp__PyBool_FromLong qtlib.obj : error LNK2001: 无法解析的外部符号 __imp__PyErr_GivenExceptionMatches qtlib.obj : error LNK2001: 无法解析的外部符号 __imp__PyMethod_New qtlib.obj : error LNK2001: 无法解析的外部符号 __imp__PyWeakref_GetObject qtlib.obj : error LNK2001: 无法解析的外部符号 __imp__PyTuple_GetSlice qtlib.obj : error LNK2001: 无法解析的外部符号 __imp__PyMethod_Type qtlib.obj : error LNK2001: 无法解析的外部符号 __imp__PyErr_Restore qtlib.obj : error LNK2001: 无法解析的外部符号 __imp__PyErr_Fetch qtlib.obj : error LNK2001: 无法解析的外部符号 __imp__PyObject_GetAttrString qtlib.obj : error LNK2001: 无法解析的外部符号 __imp__PyObject_CallObject qtlib.obj : error LNK2001: 无法解析的外部符号 __imp__PyExc_NameError sip_array.obj : error LNK2001: 无法解析的外部符号 __imp__PyExc_BufferError sip_array.obj : error LNK2001: 无法解析的外部符号 __imp__PyObject_Malloc sip_array.obj : error LNK2001: 无法解析的外部符号 __imp__PySlice_Type sip_array.obj : error LNK2001: 无法解析的外部符号 __imp__PyErr_SetNone sip_array.obj : error LNK2001: 无法解析的外部符号 __imp__PyFloat_AsDouble sip_array.obj : error LNK2001: 无法解析的外部符号 __imp__PyFloat_FromDouble sip_array.obj : error LNK2001: 无法解析的外部符号 __imp__PyErr_SetString sip_array.obj : error LNK2001: 无法解析的外部符号 __imp__PyLong_FromUnsignedLong sip_array.obj : error LNK2001: 无法解析的外部符号 __imp___PyArg_ParseTupleAndKeywords_SizeT sip_array.obj : error LNK2001: 无法解析的外部符号 __imp__PyObject_Init sip_array.obj : error LNK2001: 无法解析的外部符号 __imp__PyObject_IsInstance sip_array.obj : error LNK2001: 无法解析的外部符号 __imp__PyMem_Free sip_array.obj : error LNK2001: 无法解析的外部符号 __imp__PyExc_NotImplementedError sip_array.obj : error LNK2001: 无法解析的外部符号 __imp__PyNumber_AsSsize_t sip_array.obj : error LNK2001: 无法解析的外部符号 __imp__PyExc_IndexError siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PySequence_Size siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyBaseObject_Type siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyObject_SetAttr siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyOS_snprintf siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyThreadState_Get siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PySlice_AdjustIndices siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyExc_Exception siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyErr_SetObject siplib.obj : error LNK2001: 无法解析的外部符号 __imp___Py_BuildValue_SizeT siplib.obj : error LNK2001: 无法解析的外部符号 __imp___PyObject_CallFunction_SizeT siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyErr_WarnEx siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyFunction_Type siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyExc_DeprecationWarning siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyImport_ImportModule siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyErr_NormalizeException siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PySequence_GetItem siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyLong_FromSsize_t siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyObject_GenericGetAttr siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyExc_RuntimeError siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyUnicode_AppendAndDel siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PySlice_Unpack siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyLong_FromUnsignedLongLong siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyDict_Contains siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PySys_GetObject siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyUnicode_AsLatin1String siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyBytes_FromString siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyMem_RawMalloc siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyGILState_Release siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyTuple_New siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyDict_Size siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyLong_FromLongLong siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyBuffer_FillInfo siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyUnicode_New siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyUnicode_FromWideChar siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyDictProxy_New siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyUnicode_AsASCIIString siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyDict_Next siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyDescr_NewMethod siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyBool_Type siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyTuple_Type siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyFloat_Type siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyLong_Type siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyImport_GetModuleDict siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyModule_GetDict siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyCapsule_GetPointer siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyObject_CallFunctionObjArgs siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyLong_AsLong siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyUnicode_AsUTF8 siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyObject_GetBuffer siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyList_New siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyModule_Create2 siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyType_Ready siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyList_Append siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyWrapperDescr_Type siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyCapsule_New siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyDict_SetItem siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyDict_New siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyLong_FromVoidPtr siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyUnicode_AsWideChar siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyCapsule_Import siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyErr_NoMemory siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyDict_GetItemString siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyDict_GetItem siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyUnicode_DecodeLatin1 siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyProperty_Type siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyBytes_FromStringAndSize siplib.obj : error LNK2001: 无法解析的外部符号 __imp___Py_NotImplementedStruct siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyImport_Import siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyGILState_Ensure siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyUnicode_Compare siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyUnicode_Tailmatch siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyEval_GetFrame siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyObject_IsTrue siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyUnicode_AsUTF8String siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyTuple_Pack siplib.obj : error LNK2001: 无法解析的外部符号 __imp___PyUnicode_Ready siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyCallable_Check siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyUnicode_DecodeASCII siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyExc_SystemError siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyMem_RawFree siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyType_Modified siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyObject_Print siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyErr_Print siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyUnicode_FromString siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyBuffer_Release siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyObject_Call siplib.obj : error LNK2001: 无法解析的外部符号 __imp__Py_AtExit siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyUnicode_CompareWithASCIIString siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyType_Type siplib.obj : error LNK2001: 无法解析的外部符号 __imp__PyUnicode_FromStringAndSize threads.obj : error LNK2001: 无法解析的外部符号 __imp__PyThread_get_thread_ident voidptr.obj : error LNK2001: 无法解析的外部符号 __imp__PyLong_AsSsize_t voidptr.obj : error LNK2001: 无法解析的外部符号 __imp__PyLong_AsVoidPtr voidptr.obj : error LNK2001: 无法解析的外部符号 __imp__PyCapsule_Type build\lib.win32-cpython-37\PyQt5\sip.cp37-win_amd64.pyd : fatal error LNK1120: 147 个无法解析的外部命令 error: command 'C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.44.35207\\bin\\HostX86\\x86\\link.exe' failed with exit code 1120 [end of output] note: This error originates from a subprocess, and is likely not a problem with pip. ERROR: Failed building wheel for PyQt5-sip Failed to build PyQt5-sip ERROR: Could not build wheels for PyQt5-sip, which is required to install pyproject.toml-based projects
最新发布
08-26
### 编译时出现 `undefined reference to PyType_IsSubtype` 的原因分析 在编译Python C扩展模块时,如果遇到 `undefined reference to PyType_IsSubtype` 错误,通常是因为链接阶段缺少必要的动态或静态库支持。具体来说,该错误表明编译器无法找到 `PyType_IsSubtype` 函数的实现。 以下是可能的原因及其对应的解决方案: #### 原因 1: 链接选项未指定 Python 库 如果没有正确地将 Python 库传递给链接器,则可能会导致此类错误。这是因为 `PyType_IsSubtype` 是 Python API 中的一部分,其定义位于标准的 Python 库中。 **解决方案**: 确保在编译命令中显式添加 `-lpythonX.Y` 参数(其中 X Y 表示 Python 版本号)。例如,对于 Python 3.8,可以使用如下命令: ```bash gcc -o my_extension my_extension.c $(python3-config --includes) $(python3-config --ldflags) -lpython3.8 ``` 此命令通过 `$(python3-config --ldflags)` 自动获取所需的链接标志,并手动指定了 Python 动态库[^1]。 --- #### 原因 2: 使用了不匹配的 Python 版本 有时开发环境中的多个 Python 版本可能导致冲突。如果使用的头文件版本与实际链接的库版本不同,也可能引发类似的错误。 **解决方案**: 确认当前环境中安装的 Python 头文件库是否一致。可以通过以下方式验证: - 运行 `python3-config --libs` 查看链接路径。 - 检查目标平台上的共享对象文件是否存在,例如 `/usr/lib/python3.X/config-X.Y/libpython3.X.so`。 必要时重新配置构建工具链以指向正确的 Python 安装目录[^2]。 --- #### 原因 3: 缺少特定架构的支持 当为目标硬件(如 Cortex-A7 芯片)交叉编译时,某些情况下默认的 Python 构建可能不适合所选的目标体系结构。这会导致缺失符号解析失败的情况。 **解决方案**: 针对嵌入式设备进行交叉编译时,需特别注意以下几点: 1. **重定向 Python 库位置**: 将预编译好的适合目标系统的 Python 库复制到适当的位置; 2. **调整 LDFLAGS 变量**: 明确告知编译器查找这些自定义库的位置。例如,在 Makefile 或 shell 环境变量中设置: ```bash export LDFLAGS="-L/path/to/target/libs" ``` 此外,还需确保目标平台上已存在完整的运行时依赖项[^3]。 --- #### 示例代码片段 假设有一个简单的 Python 扩展模块 `example_module.c`,下面展示如何正确编译它并解决上述问题: ```c #include <Python.h> static PyObject* example_function(PyObject *self, PyObject *args) { return PyLong_FromLong(42); } static PyMethodDef ExampleMethods[] = { {"example", (PyCFunction)example_function, METH_VARARGS, "An example function."}, {NULL, NULL, 0, NULL} }; static struct PyModuleDef examplemodule = { PyModuleDef_HEAD_INIT, "example", "Example module.", -1, ExampleMethods }; PyMODINIT_FUNC PyInit_example(void) { return PyModule_Create(&examplemodule); } ``` 编译命令应类似于: ```bash arm-linux-gnueabihf-gcc -shared -o example.so example_module.c \ -I/usr/include/python3.8 -lpython3.8 \ -L/path/to/crosscompiled/python/libs ``` --- ### 总结 为了彻底消除 `undefined reference to PyType_IsSubtype` 类型的错误,建议按照以下顺序排查: 1. 添加合适的 Python 库作为输入参数至链接过程; 2. 核实选用的 Python 发布版与其关联组件的一致性; 3. 若涉及跨平台移植操作,则额外关注目标端特有的约束条件以及配套资源准备情况。 ---
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值