Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么python扩展共享库?可以创建一个静态链接库吗?_Python_C - Fatal编程技术网

为什么python扩展共享库?可以创建一个静态链接库吗?

为什么python扩展共享库?可以创建一个静态链接库吗?,python,c,Python,C,我是一个分机。我想做的是创建一个不需要安装其他库的扩展。这是不可能的,因为扩展必须在运行时链接到特定版本的libpython吗?您不能创建静态链接的扩展模块,因为Python需要在运行时动态加载它,并且(正如您所推断的)模块需要动态链接到libpython 您可以使用静态链接到解释器的扩展来编译自己的自定义Python版本。这通常比它的价值更麻烦 为什么要创建静态链接的扩展?如果我们有更多关于您目标的信息,我们可能会以不同的方式帮助您实现目标 欢迎来到StackOverflow.:-) 我觉得你

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

您不能创建静态链接的扩展模块,因为Python需要在运行时动态加载它,并且(正如您所推断的)模块需要动态链接到libpython

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

为什么要创建静态链接的扩展?如果我们有更多关于您目标的信息,我们可能会以不同的方式帮助您实现目标


欢迎来到StackOverflow.:-)

我觉得你把东西混在一起了。您不希望扩展在解释器中被静态链接(这是可能的,但很麻烦,因为它涉及到重建自定义解释器),您希望您的扩展不被链接到pythonxx.dll,或者被静态链接到pythonxx.dll。这是不可能的;例如,扩展和python解释器都有自己的全局变量副本,这是不好的

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


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

谢谢Daniel的回复和欢迎:)我想我正试图找出最好的方法,将一个应用程序(具有C扩展)分发到主要平台,而不需要在安装时编译。@Andrew:啊!你为什么不这么说?:)使用分发包()并生成蛋(
setup.py bdist\u egg
)。对于Windows,构建安装程序(
setup.py bdist\u wininst
)。请注意Unicode不兼容问题(请参阅)。或者,如果您的扩展包装了这些平台上常见的内容,请使用ctypes而不是扩展模块。谢谢,我将研究动态加载方法。