【问题标题】:How to compile and link multiple python modules (or packages) using cython?如何使用 cython 编译和链接多个 python 模块(或包)?
【发布时间】:2012-07-16 15:06:23
【问题描述】:

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

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

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

有没有办法编译,以便 Module1、Module2、Module3 也被编译并链接到 Module4?我想避免手动操作,例如先编译Module1.so再修改Module2中的import声明,导入Module1.so而不是Module1.py,再将Module2编译成Module2.so,以此类推....

【问题讨论】:

    标签: python compilation package cython


    【解决方案1】:

    编辑。前两个选项指的是 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 一次编译所有模块:

    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"]),
    )
    

    【讨论】:

    • 谢谢,所以选项 3 会注意自动导入 Module3.so 而不是 Module3.py(我指的是上面的示例)?
    • @Mannaggia,啊,现在我看到您不使用 Cython 特定功能(“pyx”文件),您只想使用 cython 编译普通 python 模块。是的,“import Module1”语句适用于导入“Module1.py”或“Module1.so”——只是不要将这两个文件放在同一个目录中,因为我不知道接下来会导入哪个模块。没有任何变化,.so 在导入时被视为 .py 文件。
    • @Mannaggia,没有任何变化,.so 在导入时被视为 .py 文件。将 .py 模块编译为 .so 后,一切都应该开箱即用。
    • 好的,似乎可行,我最初将所有 .py 文件重命名为 .pyx 文件并编译了所有内容。但是,我在导入模块时遇到了问题,问题是我应该为每个包保留 ___init__.py 文件,我这样做了,然后它运行顺利
    • 顺便说一下,我使用了方法1(根据我的理解是一种自动化的方法3),因为我在导入模块时需要使用原始命名空间。如果我要将所有内容合并到一个命名空间中,那么我必须编辑大量源文件,将每个 _import package1.module1 替换为 _import module1 等。我还删除了包声明部分(代码中的第 52 行来自wiki.cython.org/PackageHierarchy),它可以工作
    猜你喜欢
    • 1970-01-01
    • 2017-02-08
    • 2023-03-11
    • 2015-02-13
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多