【发布时间】:2010-05-19 13:01:36
【问题描述】:
我是扩展菜鸟。我想要做的是创建一个不需要安装其他库的扩展。这是不可能的,因为扩展必须在运行时链接到特定版本的 libpython?
【问题讨论】:
我是扩展菜鸟。我想要做的是创建一个不需要安装其他库的扩展。这是不可能的,因为扩展必须在运行时链接到特定版本的 libpython?
【问题讨论】:
您不能制作静态链接的扩展模块,因为 Python 需要在运行时动态加载它,而且(正如您所推理的那样)该模块需要动态链接到 libpython。
您可以使用静态链接到解释器的扩展来编译您自己的自定义 Python 版本。这通常比它的价值更麻烦。
为什么要制作静态链接扩展?如果我们有更多关于您的目标的信息,我们或许可以帮助您以不同的方式实现这些目标。
欢迎来到 StackOverflow。 :-)
【讨论】:
setup.py bdist_egg)。对于 Windows,构建安装程序 (setup.py bdist_wininst)。注意 Unicode 不兼容问题(请参阅bugs.python.org/issue8654)。
我认为你在混合。您不希望扩展在解释器中静态链接(这可能但很麻烦,因为它涉及重建自定义解释器),您希望扩展不与 pythonxx.dll 链接,或者静态链接到它。这是不可能的;例如,您的扩展程序和 python 解释器将拥有各自的全局变量副本,这很糟糕。
还有另一种方法,即确定哪些 Python 版本在运行时可用,并通过 LoadLibrary (Windows) 或 dlopen (Linux/etc) 加载 Python DLL 动态使用 Python/C API,然后在运行时决定方法签名取决于版本等。非常麻烦。有关 Delphi 中此类操作的示例,请参阅 PythonForDelphi:
http://www.atug.com/andypatterns/pythonDelphiTalk.htm
我不知道有其他项目会这样做。
【讨论】: