如何静态加载 python 模块(如 scipy)?
How to load python modules statically (like scipy)?
正常情况下,外部python模块如scipy、numpy等在安装时会被编译成共享对象(C语言部分)。当python调用importscipy时,会动态加载这些共享对象。
现在我在一个不支持任何动态加载功能的平台上工作。结果,我必须使用 python 静态地 link 这些模块。
我目前的做法是将scipy/numpy的所有源码编译成python,在python初始化时调用模块初始化函数。
Py_initializeEx(){
...
//init scipy modules statically
//below are scipy modules init functions
init_comb();
init_cython_special();
...
}
然而,这给我带来了另一个问题。我在许多 python 模块初始化函数中发现,特别是当它们是从 cython 自动生成时,它们包含导入其父包的代码。例如cython_special()调用了import scipy,但是在调用的时候,scipy初始化还没有完成。
我的问题是,是否有一种简单的方法可以静态 linked 这些模块?你对解决这个问题有什么建议?
谢谢
如果我没听错,你可以做的是添加一个路径到模块所在的目录。
import sys
sys.path.insert(0,'/path/to/modules')
from module1 import *
from module2 import *
等等
PyImport_AppendInittab
- 这会提前告诉 Python 与特定名称关联的模块初始化函数。您将确定所有需要使用的已编译模块,link 它们是静态的,然后在 Py_Initialize
之前将它们添加到 Inittab
.
只有在 运行 导入模块时才会发生任何事情,此时正确的初始化函数为 运行。
正常情况下,外部python模块如scipy、numpy等在安装时会被编译成共享对象(C语言部分)。当python调用importscipy时,会动态加载这些共享对象。 现在我在一个不支持任何动态加载功能的平台上工作。结果,我必须使用 python 静态地 link 这些模块。 我目前的做法是将scipy/numpy的所有源码编译成python,在python初始化时调用模块初始化函数。
Py_initializeEx(){
...
//init scipy modules statically
//below are scipy modules init functions
init_comb();
init_cython_special();
...
}
然而,这给我带来了另一个问题。我在许多 python 模块初始化函数中发现,特别是当它们是从 cython 自动生成时,它们包含导入其父包的代码。例如cython_special()调用了import scipy,但是在调用的时候,scipy初始化还没有完成。
我的问题是,是否有一种简单的方法可以静态 linked 这些模块?你对解决这个问题有什么建议? 谢谢
如果我没听错,你可以做的是添加一个路径到模块所在的目录。
import sys
sys.path.insert(0,'/path/to/modules')
from module1 import *
from module2 import *
等等
PyImport_AppendInittab
- 这会提前告诉 Python 与特定名称关联的模块初始化函数。您将确定所有需要使用的已编译模块,link 它们是静态的,然后在 Py_Initialize
之前将它们添加到 Inittab
.
只有在 运行 导入模块时才会发生任何事情,此时正确的初始化函数为 运行。