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

时间:2012-07-16 15:06:23

标签: python compilation package cython

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

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:9)

编辑。前两个选项是指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)]
)

4。 更有效的编译 - 见here

setup (
    name = 'MyProject',
    ext_modules = cythonize(["*.pyx"]),
)