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

Man*_*gia 14 python compilation package cython

我有几个python模块(组织成包),它们相互依赖.例如

  • 模块1
  • Module2:导入Module1
  • 单词数
  • Module4:导入Module3,Module 2,Module 1

让我们假设开发应用程序的相关接口在Module4中,我想使用cython生成Module4.so.如果我以天真的方式继续,我得到一个扩展Module4.so我可以导入扩展依赖于 Module1,Module2,Module3 的python源代码.

有没有一种方法可以编译,以便Module1,Module2,Module3被编译并链接到Module4?我想避免手动完成所有操作,例如首先编译Module1.so然后在Module2中更改import声明,以便导入Module1.so而不是Module1.py,然后将Module2编译成Module2.so等等....

谢谢!

Cza*_*zak 10

编辑.前两个选项是指Cython的特定代码,我错过的是关于纯python模块的问题,因此选项3是解决方案.

有几个选择:

1.请参阅"如何在程序包中创建模块的层次结构":https: //github.com/cython/cython/wiki/PackageHierarchy

2.我更喜欢"包含"声明:http: //docs.cython.org/src/userguide/language_basics.html#the-include-statement我有很多.pyx文件,它们都包含在main.pyx中,它是所有在一个命名空间.结果是一个大模块:http://code.google.com/p/cefpython/source/browse/cefpython.pyx

3.您可以通过添加多个"扩展"来使用安装程序一次编译所有模块:

setup(
    cmdclass = {'build_ext': build_ext},
    ext_modules = [Extension("example", sourcefiles), Extension("example2", sourcefiles2), Extension("example3", sourcefiles3)]
)
Run Code Online (Sandbox Code Playgroud)

4.更有效的汇编 - 见这里.

setup (
    name = 'MyProject',
    ext_modules = cythonize(["*.pyx"]),
)
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,我使用了方法1(根据我的理解,这是一种自动化方法3),因为我在导入模块时需要使用原始命名空间。如果我将所有内容合并到一个命名空间中,那么我必须编辑大量源文件,将每个 _import package1.module1 替换为 _import module1,等等。我还删除了包声明部分(来自 http://wiki.cython 的代码中的第 52 行。 org/PackageHierarchy) 并且它有效 (2认同)