小编典典

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

python

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

  • 模块1
  • Module2:导入Module1
  • 模块3
  • Module4:导入Module3,Module 2,Module 1

假设开发应用程序的相关接口在Module4中,而我想使用 cython 生成 Module4.so
。如果我以幼稚的方式进行操作,则会得到扩展Module4.so,但可以导入该扩展, 该扩展 依赖于
Module1,Module2,Module3 的python源代码

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

谢谢!


阅读 571

收藏
2021-01-20

共1个答案

小编典典

编辑。前两个选项涉及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(
    cmdclass = {'build_ext': build_ext},
    ext_modules = [Extension("example", sourcefiles), Extension("example2", sourcefiles2), Extension("example3", sourcefiles3)]
)

4.更有效的编译-请参见此处

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