__init__.so (вместо __init__.py) маскирует подпакеты - PullRequest
4 голосов
/ 08 ноября 2011

Я пишу некоторый код на Cython, и у меня есть "Пакеты" внутри "модулей" .- Это на самом деле продолжение моего вопроса там, и структура должна быть такой же.Проблема в том, что это Cython, поэтому я имею дело с .so, а не .py.

Наличие __init__.so работает до такой степени, что

import mystuff

будет работать, но, похоже, маскирует все подпакеты ниже.То есть

import mystuff.test.test1

не будет.Я получаю ImportError: No module named ... ошибку.

Как мне обойти это?Есть ли что-то, что мне нужно добавить в .pyx перед компиляцией в .c?Или, может быть, я могу переименовать __init__.so во что-то еще и каким-то образом вставить его в __init__.py (обратите внимание, что __init__.py все еще должен существовать рядом с .so, чтобы показать, что это пакет)?Или что-то еще.


Обновление: __path__ атрибут не определен для .so пакетов ...

Хорошо, у меня была мысль, что, возможно, яможно обойти это, манипулируя атрибутом __path__ пакета.Интересно, что это определено для .py пакетов, но вызывает ошибку с .so.Это не решение, но мне интересно, является ли это корнем проблемы.

Ответы [ 2 ]

2 голосов
/ 09 ноября 2011

Вероятно, наиболее простым решением данной проблемы было бы переименовать ваш модуль __init__.so во что-то вроде _native.so.После этого вы можете создать __init__.py, который будет содержать следующую строку:

from _native import *

И это должно работать так, как вы описываете.

2 голосов
/ 09 ноября 2011

Пусть ваш код Cython находится в файле, отличном от __init__.py, и импортируйте его в обычный питон __init__.py См. Мой ответ на предыдущий вопрос.

...