【问题标题】:Why are python extensions shared libraries? Is it possible to make a static-linked library?为什么 python 扩展是共享库?是否可以制作静态链接库?
【发布时间】:2010-05-19 13:01:36
【问题描述】:

我是扩展菜鸟。我想要做的是创建一个不需要安装其他库的扩展。这是不可能的,因为扩展必须在运行时链接到特定版本的 libpython?

【问题讨论】:

    标签: python c


    【解决方案1】:

    您不能制作静态链接的扩展模块,因为 Python 需要在运行时动态加载它,而且(正如您所推理的那样)该模块需要动态链接到 libpython。

    您可以使用静态链接到解释器的扩展来编译您自己的自定义 Python 版本。这通常比它的价值更麻烦。

    为什么要制作静态链接扩展?如果我们有更多关于您的目标的信息,我们或许可以帮助您以不同的方式实现这些目标。

    欢迎来到 StackOverflow。 :-)

    【讨论】:

    • 感谢 Daniel,感谢您的回复和欢迎 :) 我想我正在尝试找出将应用程序(具有 C 扩展名)分发到主要平台而不需要在安装时编译的最佳方式.
    • @Andrew:啊!你为什么不这么说? :) 使用分发包 (pypi.python.org/pypi/distribute) 并构建鸡蛋 (setup.py bdist_egg)。对于 Windows,构建安装程序 (setup.py bdist_wininst)。注意 Unicode 不兼容问题(请参阅bugs.python.org/issue8654)。
    • 或者,如果您的扩展包含了这些平台上常见的内容,请使用 ctypes 而不是扩展模块。
    【解决方案2】:

    我认为你在混合。您不希望扩展在解释器中静态链接(这可能但很麻烦,因为它涉及重建自定义解释器),您希望扩展不与 pythonxx.dll 链接,或者静态链接到它。这是不可能的;例如,您的扩展程序和 python 解释器将拥有各自的全局变量副本,这很糟糕。

    还有另一种方法,即确定哪些 Python 版本在运行时可用,并通过 LoadLibrary (Windows) 或 dlopen (Linux/etc) 加载 Python DLL 动态使用 Python/C API,然后在运行时决定方法签名取决于版本等。非常麻烦。有关 Delphi 中此类操作的示例,请参阅 PythonForDelphi:

    http://www.atug.com/andypatterns/pythonDelphiTalk.htm

    我不知道有其他项目会这样做。

    【讨论】:

    • 谢谢,我研究一下动态加载方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多