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

时间:2019-02-21 10:49:23

标签: python windows visual-c++

我正在为plex媒体服务器开发插件。 Plex使用Python 2.7作为插件系统。我需要使用python-levenshtein软件包,该软件包需要针对不同的系统进行编译。

我找到了python-Levenshtein轮子(许多Linux,macos,arm,windows),但是Windows轮子是用VS 2008编译的(msvcr90.dll)。并将plex嵌入使用VS 2013(msvcr130.dll)编译的python。

在Windows 10上,如何使用不同的VS运行时编译python软件包?

1 个答案:

答案 0 :(得分:0)

注意::Python团队不支持官方版本以外的其他Python版本的编译扩展,该产品必须受产品支持-在这种情况下为Plex。因此,假设Plex没有提供执行此操作的方法,则下面的内容都是黑客和变通方法。

此外,如果库开发人员未在进行构建,则您将尝试对其进行介绍,这意味着您基本上处于其“水平”,并且需要与他们一样了解他们的代码。欢迎使用开源软件:)

最后,这仅适用于旧版Python2。如果使用Python 3.5或更高版本的人阅读,请安装最新的Visual Studio并使用最新的编译器-整个14.x行都兼容,并且可以使用可以使用最新的Python版本。


假设您对扩展与C运行时的交互方式非常谨慎,通常可以根据“错误的” C运行时版本来编译扩展。这里要注意的事情是:

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

如果所有这些都是孤立的,那么您将在内存中得到两个C运行时,并且它们将不会尝试进行交互。


现在,如果由于某些原因无法执行此操作,则可以尝试使用更高版本的工具集来编译扩展。最简单的方法是:

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

现在,您可以按常规方式获取转轮文件并进行安装,也许是通过提取/复制文件或将完整文件名传递到pip

通常,很可能仅建立扩展就不会成功。在这种情况下,您必须修改源代码才能正常工作-在VC 9.0和VC 12.0之间的三个MSVC版本中,很多名称已被弃用和删除,因此您不会看到其中的任何弃用警告。

如果库开发人员已经使他们的库可以使用Python 3,则许多修补程序应该存在,但可能无法检测到(因为Python 3使用了不需要修补程序的VC 10.0或VC 14。 x,可能会检测为_MSC_VER >= 1900,而不会检测到VC 12.0)。如果您提供所做的任何修补以帮助下一个人,他们将不胜感激,但是许多库开发人员现在都放弃了对3.5之前的Python版本的支持,因此他们可能不希望维护旧版支持。