【发布时间】:2019-08-07 12:13:14
【问题描述】:
我有一种实验性的编程语言,程序被编译成 c。我编写了一个 cython 包装器,它包装了已编译的 c 代码,并允许它可以从 python 调用。这使您可以将已编译的程序用作 python 中的快速低级函数。通常情况下,我们想在同一个 python 程序中使用多个这样的程序。那么生成和导入各个程序的管道是:
- 使用编译器将程序编译为 c。
- 使用 gcc 将 c 代码编译为 .so 共享对象。
- 生成一个 .pyx 包装器,它可以从 python 访问我们想要使用的 c 函数。
- 使用 cythonize 编译 .pyx 包装器以生成 .so。
- 使用 python 的导入功能导入 .so 共享对象。
在实践中,步骤 1-4 实际上被合并为一个外部调用 make 使用 sys,生成的 Makefile 执行这 4 个步骤中的每一个。这让我们可以通过外部调用 sys 来调用 make,然后在不离开 python 的情况下导入编译的程序。
已编译的程序可能具有概率构造。特别是,分支决策由随机数控制。为此,调用 c 的本机
rand()
功能。当在 python 中导入包装编译程序时,将对使用 cythonize 生成的生成的 .so 共享对象进行导入调用。到目前为止,我已经尝试调用
srand(<long int>time(NULL)
来自包装每个已编译程序的 .pyx 文件。据我所知,每个导入的 .so 都将有效地使用自己的随机数生成器。但是从文档中我根本不清楚是否是这种情况。
最终我希望不同的 .so 使用相同的随机数生成器,但我不知道该怎么做。任何指导将不胜感激。大部分代码太长,无法包含在此处,但如果您想查看任何 sn-ps(例如,“你如何做 x 组件?”)我会很乐意提供。
即使您所能提供的只是对 rand() 的调用如何在 cythonize 生成的不同共享对象之间进行交互的解释,这也可能足以让我找到解决方案。
提前致谢!
【问题讨论】:
-
你可以通过
nm my_extension.so | grep rand查看,如果rand@@GLIB_XXX有属性U(很可能),那么它将由libc.so提供,并且状态在所有模块之间共享。