Как загрузить модули Python статически (например, scipy)? - PullRequest
1 голос
/ 20 марта 2019

В обычных условиях внешние модули Python, такие как scipy и numpy, при установке компилируются в общие объекты (часть написана на C).Когда python вызывает import scipy, он динамически загружает эти общие объекты.Сейчас я работаю на платформе, которая не поддерживает функцию динамической загрузки.В результате я должен статически связать эти модули с python.Мой текущий подход состоит в том, чтобы скомпилировать весь исходный код 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 () вызывает импорт scipy, но когда он вызывается, инициализация scipy еще не завершена.

Мой вопрос: есть ли простой способ, чтобы я мог статически связать эти модули?Каковы ваши предложения по решению этой проблемы?Спасибо.

Ответы [ 2 ]

1 голос
/ 20 марта 2019

PyImport_AppendInittab - это заранее сообщает Python о функции инициализации модуля, связанной с конкретным именем. Вы должны определить все модули, которые вам нужно использовать, которые скомпилированы, связать их статически, а затем перед Py_Initialize добавить их в Inittab.

Ничего не происходит, пока модуль не будет импортирован во время выполнения, когда запущена правильная функция инициализации.

0 голосов
/ 20 марта 2019

Если я вас правильно понял, вы могли бы добавить путь к директории, в которой будут расположены модули.

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

и т.д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...