为不同的C++运行时编译Python扩展

2024-06-16 11:45:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为plex media server开发一个插件。Plex使用Python2.7作为插件系统。我需要使用python levenshtein包,它需要为不同的系统编译。你知道吗

我找到了python Levenshtein轮子(manylinux、macos、arm、windows),但是找到了用vs2008编译的windows轮子(msvcr90.dll)。以及使用VS2013(msvcr130.dll)编译的plex嵌入式python。你知道吗

在windows10上,如何用不同的VS运行时编译python包?你知道吗


Tags: 插件serverwindows系统macosplexmedia轮子
1条回答
网友
1楼 · 发布于 2024-06-16 11:45:37

注意:Python团队不支持为官方发行版以外的Python版本编译扩展,并且必须由产品(在本例中是Plex)支持。所以假设Plex没有提供一种方法来做到这一点,下面的一切都是黑客和变通方法。你知道吗

另外,如果库开发人员没有进行构建,那么您就要尝试覆盖它们,这意味着您基本上处于它们的“级别”,并且需要像它们一样了解它们的代码。欢迎使用开源软件:)

最后,这只适用于遗留的python2。如果有人在python3.5或更高版本上阅读本文,只需安装最新的Visual Studio并使用最新的编译器-整个14.x行是兼容的,并且可以与最新的Python版本很好地工作。你知道吗


假设您对扩展如何与C运行时交互很小心,那么针对“错误”的C运行时版本编译扩展通常是安全的。这里需要注意的是:

  • 分配将由Python释放的内存
  • 释放Python分配的内存
  • 向Python传递/获取文件描述符或FILE*指针
  • 设置任何全局设置,如编码或区域设置
  • 写入标准流

如果所有这些都是孤立的,那么您只需在内存中创建两个C运行时,它们就不会尝试交互。你知道吗


现在,如果由于某种原因无法完成,可以尝试使用更高版本的工具集编译扩展。最简单的方法是:

  • 获取源代码(我假设通过wheel基于setup.py构建)
  • 打开VS 2013开发人员命令提示符
  • 运行set DISTUTILS_USE_SDK=1(这将绕过MSVC检测)
  • 运行set MSSdk=1(也需要绕过旧式python2上的检测)
  • 运行python setup.py bdist_wheel(可能需要先将wheel安装到Python中)

现在,您可以使用wheel文件并以通常的方式安装它,可以通过提取/复制文件或将完整文件名传递给pip。你知道吗

一般来说,简单地构建扩展很有可能不会成功。在这种情况下,您必须修改源代码才能工作-在VC 9.0和VC 12.0之间的三个MSVC版本中,有许多名称被弃用并删除,因此您不会看到任何一个的弃用警告。你知道吗

如果库开发人员已经让他们的库与python3一起工作,那么许多修复程序应该在那里,但可能没有被检测到(因为python3使用的是vc10.0,它不需要这些修复程序,或者vc14.x,它可能被检测为_MSC_VER >= 1900,并且不会检测到vc12.0)。如果您提供了所做的任何修复以帮助下一个人,他们可能会很感激,但是现在许多库开发人员正在放弃对Python 3.5之前版本的支持,因此他们可能对维护遗留支持不感兴趣。你知道吗

相关问题 更多 >