当前位置: 首页 > 面试题库 >

将多个子模块折叠为一个Cython扩展

彭鹭洋
2023-03-14
问题内容

此setup.py:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize

extensions = (
    Extension('myext', ['myext/__init__.py',
                        'myext/algorithms/__init__.py',
                        'myext/algorithms/dumb.py',
                        'myext/algorithms/combine.py'])
)
setup(
    name='myext',
    ext_modules=cythonize(extensions)
)

没有预期的效果。我希望它产生一个myext.so,它可以完成;但是当我通过

python -m myext.so

我得到:

ValueError: Attempted relative import in non-package

由于myext试图参考事实.algorithms

任何想法如何使它工作?


问题答案:

首先,我应该注意,不可能.so使用Cython编译带有子包的单个文件。因此,如果需要子包,则必须生成多个.so文件,因为每个文件.so只能代表一个模块。

其次,似乎没有可以编译多个Cython / Python文件(我正在专门使用Cython语言)并将它们链接到单个模块中。

我试着乘用Cython文件编译成一个单一的.so每哪种方式,都与distutils与手动编译,它总是无法导入在运行时。

将已编译的Cython文件与其他库甚至其他C文件链接起来似乎很好,但是将两个已编译的Cython文件链接在一起时出了点问题,并且结果不是正确的Python扩展。

我能看到的唯一解决方案是将所有内容编译为单个Cython文件。就我而言,我已经编辑了我的文件setup.py以生成一个.pyx文件,该文件又include.pyx源目录中的每个文件:

includesContents = ""
for f in os.listdir("src-dir"):
    if f.endswith(".pyx"):
        includesContents += "include \"" + f + "\"\n"

includesFile = open("src/extension-name.pyx", "w")
includesFile.write(includesContents)
includesFile.close()

然后我只是编译extension- name.pyx。当然,这会破坏增量和并行编译,并且由于所有内容都粘贴到同一文件中,因此可能会导致额外的命名冲突。从好的方面来说,您不必编写任何.pyd文件。

我当然不会称其为首选的构建方法,但是如果所有内容都必须在一个扩展模块中,则这是我看到的唯一方法



 类似资料:
  • 问题内容: 我有一个具有以下布局的表: 我想将表转换为如下所示的布局: 我在PostgreSQL中使用SQL。有没有一种简单的方法(且内存效率高)来做到这一点?我看过一些提到使用透视的帖子,但是我不确定这是否行得通,而且我看到的描述似乎是针对Oracle的。 问题答案: 如果尚未安装,请首先安装扩展tablefunc。每个数据库需要做一次。 你需要的PostgreSQL 9.1 的。在旧版本中,您

  • 假设我们有一个cython类,它的指针指向,如 我们还在另一个模块中有一个cython类,它需要访问下的数据: 使用和的相应Python代码可能类似于 我们如何定义以及在中,我们将对使用什么?

  • 问题内容: 我正在尝试将cython模块data.pyx导入另一个cython模块user.pyx。一切编译正常,但是当我尝试在python模块中调用user.pyx时,出现错误“ ImportError:没有名为data的模块”。 一切都在同一目录中。 我的setup.py 运行以下test.py将引发错误。 我得到的例外是 如何进行导入?谢谢你的帮助。 问题答案: 我可能缺少有关Cython的

  • 本文向大家介绍F# 折叠介绍,并举几个例子,包括了F# 折叠介绍,并举几个例子的使用技巧和注意事项,需要的朋友参考一下 示例 折叠是与元素序列一起使用的(高阶)函数。他们崩溃seq<'a>到'b那里'b是任何类型(还可能'a)。这有点抽象,因此让我们进入具体的实际示例。 计算所有数字的总和 在此示例中,'a是int。我们有一个数字列表,我们想计算所有数字的总和。总结列表中的数字,[1; 2; 3]

  • 主要内容:可折叠内容块,实例,实例,嵌套可折叠块,实例,可折叠集合,实例,更多实例可折叠内容块 可折叠块允许您隐藏或显示内容 - 对于存储部分信息很有用。 如需创建一个可折叠的内容块,需要为容器添加 data-role="collapsible" 属性。在容器(div)内,添加一个标题元素(H1-H6),后跟您想要进行扩展的 HTML 标记: 实例 <div data-role="collapsible"> <h1>点击我 - 我可以折叠!</h1> <p>我是可折叠的内容。<

  • 可折叠内容块 可折叠块允许您隐藏或显示内容 - 对于存储部分信息很有用。 如需创建一个可折叠的内容块,需要为容器添加 data-role="collapsible" 属性。在容器(div)内,添加一个标题元素(H1-H6),后跟您想要进行扩展的 HTML 标记: <div data-role="collapsible"> <h1>点击我 - 我可以折叠!</h1> <p>我是可折叠的内容。</

  • Szenario:我有两个扩展,它们用一些特定字段扩展了。在TYPO3 9之前,我必须使用以下打字脚本配置对新闻扩展的依赖关系进行配置: 模型扩展了基本扩展的模型: 在TYPO3 10中,在(中断:#87623): 只要您只有一个扩展新闻扩展名的扩展名,它就可以工作多久。如果您有第二个扩展并启用TYPO3缓存,您将得到一个错误,即在第一个扩展中添加的字段在新闻扩展的模板中不可用。奇怪的是,这个问题

  • 问题内容: 我已经阅读了很多关于此的文章/说明,并且花费了太多时间,但是所有内容要么太广泛,要么太具体。 这个问题实际上仅适用于我制作的Applet。它包含一个类,并需要其他2个Jar库。我已经将它们包括在项目中(多个项目,因为我已经在Netbeans和Eclipse中进行了尝试……很容易重新创建一个Class项目)。所有这些的关键是我的HTML / web项目不必处理多个Jar或引用它们。这也不