我是扩展菜鸟。我想要做的是创建一个不需要安装其他库的扩展。这是不可能的,因为扩展必须在运行时链接到特定版本的libpython吗?
答案 0 :(得分:5)
你不能创建一个静态链接的扩展模块,因为Python需要在运行时动态加载它,因为(正如你的推理)模块需要动态链接libpython。
您可以使用静态链接到解释器的扩展编译自己的Python自定义版本。这通常比它的价值更麻烦。
为什么要创建静态链接的扩展?如果我们有关于您的目标的更多信息,我们可能会帮助您以不同的方式实现这些目标。
欢迎使用StackOverflow。 : - )
答案 1 :(得分:3)
我认为你在混合东西。您不希望扩展在解释器中静态链接(这可能很麻烦,因为它涉及重建自定义解释器),您希望扩展不与pythonxx.dll链接,或者静态链接到它。这是不可能的;你的扩展和python解释器将拥有各自的全局变量副本,例如Bad。
还有另一种方法,即通过LoadLibrary(Windows)或dlopen(Linux / etc)加载Python DLL,然后在运行时决定,确定运行时可用的Python版本以及动态使用Python / C API。方法签名取决于版本等。非常繁琐。有关Delphi中此类操作的示例,请参阅PythonForDelphi:
http://www.atug.com/andypatterns/pythonDelphiTalk.htm
我不知道有任何其他项目会这样做。