如何静态加载python模块(如scipy)?

问题描述 投票:1回答:2

在正常情况下,scipy和numpy等外部python模块在安装时会被编译成共享对象(用C语言编写的部分)。当python调用import scipy时,它将动态加载这些共享对象。现在我正在开发一个不支持任何动态加载功能的平台。因此,我必须使用python静态链接这些模块。我目前的方法是使用python编译scipy / numpy的所有源代码,并在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初始化还没有完成。

我的问题是,有一种简单的方法可以静态链接这些模块吗?你有什么建议来解决这个问题?谢谢。

python numpy scipy cython cpython
2个回答
1
投票

PyImport_AppendInittab - 这预先告诉Python与特定名称关联的模块初始化函数。您将确定需要使用的所有已编译的模块,静态链接它们,然后在Py_Initialize之前将它们添加到Inittab

在运行正确的初始化函数时,在运行时导入模块之前不会发生任何事情。


0
投票

如果我找到了你,你可以做的是添加一个模块将位于目录的路径。

import sys
sys.path.insert(0,'/path/to/modules')
from module1 import *
from module2 import * 

等等

© www.soinside.com 2019 - 2024. All rights reserved.