为什么Python扩展是共享库?是否可以创建静态链接库?

7

我是一个扩展程序新手。我的目标是创建一个不需要安装其他库的扩展程序。这是否不可能,因为扩展程序在运行时必须链接到特定版本的libpython?

2个回答

6
您无法创建静态链接的扩展模块,因为Python需要在运行时动态加载它,并且因为(正如您推理的那样),该模块需要动态链接到libpython。
您可以编译自己定制的Python版本,并将其静态链接到解释器中。但这通常会带来更多麻烦。
为什么您想要创建静态链接的扩展?如果我们了解更多关于您目标的信息,也许我们可以用不同的方式帮助您实现它们。
欢迎来到StackOverflow. :-)

谢谢Daniel的回复和欢迎 :) 我想我正在尝试找出在不需要安装时编译的情况下,将一个具有C扩展的应用程序(分发)到主要平台的最佳方式。 - amoffat
@Andrew:啊!你为什么不早说呢?使用distribute包(http://pypi.python.org/pypi/distribute)并构建egg(`setup.py bdist_egg)。对于Windows,构建安装程序(setup.py bdist_wininst`)。注意Unicode不兼容问题(请参见http://bugs.python.org/issue8654)。 - Daniel Stutzbach
1
或者,如果您的扩展包装了这些平台上通常已经存在的内容,请使用ctypes而不是扩展模块。 - fraca7

3
我认为您把事情搞混了。您不想将扩展静态链接到解释器中(这是可能的,但很麻烦,因为它涉及重新构建定制解释器),而是希望您的扩展程序不与pythonxx.dll链接或以静态方式链接到它。这是不可能的;例如,您的扩展和Python解释器将各自拥有全局变量的副本,这是错误的。

还有另一种方法,就是在运行时确定可用的Python版本,并通过LoadLibrary(Windows)或dlopen(Linux / etc)使用Python / C API动态加载Python DLL,然后根据版本在运行时决定方法签名等。非常麻烦。有一个在Delphi中执行此类操作的示例项目,可以查看PythonForDelphi:

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

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


谢谢,我会研究动态加载方法。 - amoffat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接