22

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

  • 模块1
  • 模块 2:导入模块 1
  • 模块3
  • 模块 4:导入模块 3、模块 2、模块 1

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

有没有办法编译,以便模块 1、模块 2、模块 3 也被编译并链接到模块 4?我想避免手动做所有事情,例如先编译Module1.so然后在Module2中更改导入声明,以便导入Module1.so而不是Module1.py,然后将Module2编译成Module2.so等等......

4

1 回答 1

15

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

有几个选项:

1.参见这篇“如何在包中创建模块的层次结构”: https ://github.com/cython/cython/wiki/PackageHierarchy

2. 我更喜欢“include”语句: 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 一次编译所有模块:

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

4. 更高效的编译 - 见这里

setup (
    name = 'MyProject',
    ext_modules = cythonize(["*.pyx"]),
)
于 2012-07-16T15:50:07.460 回答