如何使用cython编译和链接多个python模块(或包)?

如何使用cython编译和链接多个python模块(或包)?,python,compilation,package,cython,Python,Compilation,Package,Cython,我有几个python模块(组织成包),它们相互依赖。e、 g 模块1 模块2:导入模块1 模块3 模块4:导入模块3、模块2、模块1 让我们假设开发应用程序的相关接口位于模块4中,我想生成一个模块4。 如果我以简单的方式继续,我会得到一个扩展Module4.so,我可以导入它,但是扩展依赖于Module1、Module2、Module3的python源代码 是否有一种编译方法,可以编译模块1、模块2、模块3并将其链接到模块4?我希望避免手动执行所有操作,例如首先编译Module1.so,然后

我有几个python模块(组织成包),它们相互依赖。e、 g

  • 模块1
  • 模块2:导入模块1
  • 模块3
  • 模块4:导入模块3、模块2、模块1
让我们假设开发应用程序的相关接口位于模块4中,我想生成一个模块4。 如果我以简单的方式继续,我会得到一个扩展Module4.so,我可以导入它,但是扩展依赖于Module1、Module2、Module3的python源代码

是否有一种编译方法,可以编译模块1、模块2、模块3并将其链接到模块4?我希望避免手动执行所有操作,例如首先编译Module1.so,然后更改Module2中的导入声明,以便导入Module1.so而不是Module1.py,然后将Module2编译为Module2.so等等


谢谢

编辑。前两个选项涉及Cython的特定代码,我遗漏的是问题是关于纯python模块的,所以选项3是解决方案

有几种选择:

一,。 请参阅“如何在包中创建模块层次结构”:

二,。 我更喜欢“包括”的说法: 我有许多.pyx文件,它们都包含在main.pyx中,都在一个名称空间中。结果是一个大模块:

三,。 通过添加多个“扩展名”,可以使用安装程序一次编译所有模块:

四,。 更有效的汇编—请参阅


谢谢,所以选项3会注意自动导入Module3.so而不是Module3.py(我指的是上面的例子)?@Mannaggia,啊,现在我看到你没有使用Cython特定的功能(“pyx”文件),你只想用Cython编译普通的python模块。是的,语句“import Module1”用于导入“Module1.py”或“Module1.so”-只是不要将两个文件放在同一目录中,因为我不知道将导入哪个模块。没有任何变化,.so在导入时被视为.py文件。@Mannaggia,没有任何变化,.so在导入时被视为.py文件。在您将.py模块编译为.py之后,一切都应该开箱即用。好的,似乎一切正常,我最初将所有.py文件重命名为.pyx文件并编译了所有内容。然而,我在导入模块时遇到了问题,问题是我应该为每个包保留_____init__.py文件,我这样做了,然后它平稳运行。顺便说一句,我使用了方法1(据我所知,这是一种自动化3的方法),因为导入模块时我需要使用原始名称空间。如果我要将所有文件合并到一个名称空间中,那么我必须编辑大量的源文件,将每个_importpackage1.module1替换为_importmodule1,等等。我还删除了包声明部分(代码中的第52行),它可以正常工作
setup(
    cmdclass = {'build_ext': build_ext},
    ext_modules = [Extension("example", sourcefiles), Extension("example2", sourcefiles2), Extension("example3", sourcefiles3)]
)
setup (
    name = 'MyProject',
    ext_modules = cythonize(["*.pyx"]),
)