繁体   English   中英

动态链接Python扩展(.pyd)到另一个扩展

[英]Dynamically Linking Python Extension (.pyd) to Another Extension

Python扩展模块只是动态库,因此我假设可以将Python扩展动态链接到另一个。 问题是在Windows上,Python Extensions被赋予.pyd扩展名而不是.dll ,所以当我运行安装脚本时,我无法让distutils链接到它们。 (我不认为这是UNIX上的问题,因为Python扩展使用.so文件扩展名。)

假设我有一个扩展名bar.pyd ,需要链接到foo.pyd 基本上,我在安装脚本中所做的是:

from distutils.core import setup, Extension

foo = Extension("foo", sources=["foo.c"])
bar = Extension("bar", libraries=["foo"], sources=["bar.c"])
setup(ext_modules=[foo, bar])

到目前为止,这是行不通的。 这甚至可能吗? 我认为是,但我无法在网上找到任何东西。 我在Windows上使用MinGW,但我希望这可以使用不同的MSVC ++以及其他系统。

编辑:以前,我通过将编译foo时创建的目标文件( foo.o )传递给扩展中的extra_objects选项解决了这个问题(这只有在我在bar定义所有foo符号的原型时才有效):

bar = Extension("bar", sources=["bar.c"], extra_objects=["build/.../foo.o"]

这似乎不是正确的解决方案,但它确实有效。 我不明白动态链接,所以这可能是正确的方法。 但是感觉非常错误。

然后,我尝试将一些显式参数传递给gcc,以使其编译导入库:

foo = Extension("foo", sources=["foo.c"], extra_compile_args=["-Wl,--out-implib,foo.lib,--export-all-symbols"])

然后我将bar链接到新的导入库:

bar = Extension("bar", libraries=["foo"], sources=["bar.c"])

这个编译没有抱怨,但是有一些符号存在一些问题(具体来说,我在foo中有一些全局PyTypeObject似乎在bar重新定义。我需要两个模块中的PyTypeObject引用相同的定义。) 。

编辑2:所以,我挑出了问题。 在我构建并链接到导入库之后,函数符号正确导出,但PyTypeObject正在重新声明。 假设foo有一个PyTypeOject Foo_Type 我在foo.h声明了它,它包含在foo.cbar.c

PyTypeObject Foo_Type;

我拿出来,把它放在foo.c的顶部附近:

PyTypeObject __declspec(dllexport) Foo_Type;

这靠近bar.c的顶部:

PyTypeObject __declspec(dllimport) Foo_Type;

这解决了问题。 然后我可以在foobar使用Foo_Type,它引用了与Foo_Type相同的定义。 问题是,这不适用于非Windows系统。 我假设如果我只是把__declspec拿出来,它在其他系统上工作正常。

如果您使用的是普通的Python 导入机制,则无需链接其他扩展。 如果您在另一个扩展中调用函数,可能是因为您已经保留了头文件,那么您需要先从DLL生成一个导入库,然后才能链接它。

from distutils.core import Extension as cExtension
from pyd.support import setup, Extension

module1 = Extension("x", sources = ['xclass.c'])
module2 = Extension("y", sources = ['hello.d'], build_deimos=True)

setup(
    name = "x",
    version = '1.0',
    description = "eat a taco",
    ext_modules = [
        module1,
        module2
    ]
);

来自: http//pyd.readthedocs.io/en/latest/distutils.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM