当前位置: 首页 > 面试题库 >

使用调试Python安装在Windows上构建Python-C-Extension

仲孙焱
2023-03-14
问题内容

如果我从Windows上的源代码构建CPython,则在要点安装包含C-Extension的软件包时会遇到问题。似乎在链接库时发生错误。

例如,在安装cython时(但在其他C扩展软件包上,它也因相同的错误而崩溃):

链接:致命错误LNK1104:无法打开文件’python38.lib’

错误:命令’C:\ Program Files(x86)\ Microsoft Visual Studio \ 2019 \ Enterprise \
VC \ Tools \ MSVC \ 14.23.28105 \ bin \ HostX86 \ x86 \
link.exe’失败,退出状态为1104

它无法打开“ python38.lib”的原因是因为在调试模式下的“ .lib”文件称为“ python38_d.lib”。

一个最小的可复制示例是(在命令行上)基于CPython开发人员指南的快速参考:

git clone --branch v3.8.0 https://github.com/python/cpython.git
cd cpython
git checkout v3.8.0
.\PCbuild\build.bat -e -d
.\PCbuild\win32\python_d.exe -m ensurepip
.\PCbuild\win32\python_d.exe -m pip install pip --upgrade -vv
.\PCbuild\win32\python_d.exe -m pip install setuptools --upgrade -vv
.\PCbuild\win32\python_d.exe -m pip install cython -vv

结果distutils.sysconfig.get_config_vars()是:

{'BINDIR': '...\\cpython\\PCbuild\\win32',
 'BINLIBDEST': ...\\cpython\\Lib',
 'EXE': '.exe',
 'EXT_SUFFIX': '_d.cp38-win32.pyd',
 'INCLUDEPY': '...\\cpython\\include;...\\cpython\\PC',
 'LIBDEST': '...\\cpython\\Lib',
 'SO': '_d.cp38-win32.pyd',
 'VERSION': '38',
 'exec_prefix': '...\\cpython',
 'prefix': '...\\cpython',
 'srcdir': '...\\cpython'}

有什么我想念的吗?是否完全不支持在Windows上的Python调试版本上构建C-Extensions?如果支持:我该怎么办?


问题答案:

pythonXY.lib在Windows上,针对的链接有点偷偷摸摸。当您查看用于链接的命令行时,您会看到没有python库传递给链接器,即’link.exe’。注意:对于Linux也是如此,但是在Linux上则不必这样做,因为所需的符号将由python-
executable提供。

但是,很容易通过来检查是否 dumpbin /dependents resulting.pyd存在依赖关系pythonXY.dll,并且还extra_link_args = ["/VERBOSE:LIB"]对扩展定义进行了添加,并且触发链接器的详细模式将显示该链接器使用pythonXY.lib

偷偷摸摸的部分:Microsoft Compler具有便利的编译指示,#pragma comment(lib, ...)可以自动触发库的链接,该链接也用在Python标头中:

#               if defined(_MSC_VER)
                        /* So MSVC users need not specify the .lib
                        file in their Makefile (other compilers are
                        generally taken care of by distutils.) */
#                       if defined(_DEBUG)
#                               pragma comment(lib,"python39_d.lib")
#                       elif defined(Py_LIMITED_API)
#                               pragma comment(lib,"python3.lib")
#                       else
#                               pragma comment(lib,"python39.lib")
#                       endif /* _DEBUG */
#               endif /* _MSC_VER */

如您所见,要链接到调试版本,需要定义_DEBUG

_DEBUGdistutilsWindows自动定义,如果build_ext通过options调用--debug,例如

python setup.py build_ext -i --debug

可以翻译pip

pip install --global-option build --global-option --debug XXXXX

它可以大致解释为:触发build命令(还包括build_ext-command),--debug在安装前带有选项。

构建调试C扩展时的另一种功能,在Windows上还有更多功能:

#ifdef _DEBUG
#       define Py_DEBUG
#endif

在Python3.8之前定义 Py_DEBUG宏意味着无与伦比的ABI
,因为它还假设这会导致发布模式的不同内存布局以及某些其他功能缺失。Py_TRACE_REFSPyObject

但是,从Python3.8开始,通过提供缺少的pythonXY_d.lib/pythonYX.lib作为链接到另一个版本的符号链接,可能可以摆脱它。



 类似资料:
  • 本文向大家介绍在Windows上安装Python,包括了在Windows上安装Python的使用技巧和注意事项,需要的朋友参考一下 Python发行版可用于多种平台。您只需要下载适用于您的平台的二进制代码并安装Python。 如果平台的二进制代码不可用,则需要C编译器来手动编译源代码。在安装所需的功能选择方面,编译源代码可提供更大的灵活性。 以下是在Windows计算机上安装Python的步骤。

  • 问题内容: 有人在Windows上成功安装了PygraphViz吗? 由于没有Windows的正式发行版,因此我尝试自己构建它,但无法编译。我不是第一个来面对这个问题,但我无法找到答案。 这是控制台输出: 任何帮助,将不胜感激! 问题答案: 这是在Python 2.7中对我有用的。我认为它在Python 2.6中应该类似地工作。前提条件:安装mingw32(如果使用的话,包含在pythonxy d

  • 在 Windows 上安装 Python 和安装普通软件一样简单,下载安装包以后猛击“下一步”即可。 Python 安装包下载地址: https://www.python.org/downloads/ 打开该链接,可以看到有两个版本的 Python,分别是 Python 3.x 和 Python 2.x,如下图所示: 图 1 Python 下载页面截图(包含 Python 2.x 和 Python

  • 问题内容: 如何在Windows上安装pip? 问题答案: Python 2.7.9+和3.4+ 好消息!Python3.4(2014年3月发布)和Python2.7.9(2014年12月发布)随Pip一起发布。这是任何Python版本中最好的特性。它使社区丰富的图书馆向每个人开放。由于设置的困难,新手不再被排除在使用社区库之外。在与包管理器一起发布时,Python加入了、、、,几乎所有其他当代语

  • 问题内容: 我正在尝试将某些日期/时间转换为UTC,我认为这在Python中会变得非常简单- 包括电池,对吗?好吧,这很简单,除了Python(2.6)不包含任何tzinfo类。没问题,快速搜索就会发现python- dateutil 应该完全符合我的需求。 问题是我需要在Windows上安装它。我可以使用7-zip支持.tar.gz2发行版,但是现在我只剩下了一些文件,而且没有任何指导。当我尝试

  • 问题内容: 我正在尝试在Windows上安装TensorFlow。 我尝试使用安装它,但始终收到相同的错误消息: 我首先使用Python 3.5.1进行了尝试,现在我升级到 3.6.0b4 ,但这没有什么区别。 蟒蛇: 点: 确切地说,我尝试了以下两个命令: 他们输出以下内容: 有谁知道如何解决这个问题?我不确定我在哪里犯错。 谢谢! 编辑1 顺便说一句,我也尝试过并且喜欢这里的建议。我得到以下输