Этого вопрос имеет некоторое сходство с:Пространство имен Python C-ext, смешанное с регулярными подмодулями python?
Nested Python C Extensions/Modules?
только с небольшим поворотом. Здесь я не пытаюсь смешивать два C-exts, но один C-ext и обычный подмодуль python.
Есть ли способ, чтобы C-расширение делило пространство имен модулей между символами «module.so» и теми, что присутствуют в подмодуле?
Моя структура модуля выглядит следующим образом:
facs/
facs/
__init__.py
setup.py
facs.so
[*.c files]
utils/
__init__.py
galaxy.py
Если удалить «утилиты» из иерархии, я могу импортировать FACS и увидеть facs.so
методы:
>>> import facs
>>> dir(facs)
['__doc__', '__file__', '__name__', '__package__', 'build', 'query', 'remove']
Но когда я поставил возвращает субмодуль назад и пытается импортировать разные части, одно пространство имен, похоже, маскирует другое (utils
маскирует символы, экспортируемые facs.so
):
>>> import facs
>>> dir(facs)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
>>> import facs.utils
>>> facs.utils.galaxy.rsync_genomes("phix")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'galaxy'
>>> from facs.utils import galaxy
>>> galaxy.rsync_genomes("phix")
'Hello world'
Как вы видите, после dir(facs)
, build
, query
и remove
ушли и galaxy
не импортируются правильно, если я не делаю from facs.utils import galaxy
вместо повторного использования первоначального оператора импорта и просто доступ через facs.utils.galaxy.rsync_genomes()
непосредственно.
Подводя итог, мой предполагаемое использование этого модуля будет делать:
>>> import facs
>>> dir(facs)
['__doc__', '__file__', '__name__', '__package__', 'build', 'query', 'remove'
, 'utils'] <--- (Directly accessible from "facs")
>>> facs.utils.galaxy.rsync_genomes("phix")
'Hello world'
(в данный момент в стадии разработки) код находится в:
https://github.com/brainstorm/facs/tree/develop
В случае, если кто хочет попробуйте сами. Я использую virtualenvs и мой $ PYTHONPATH кажется правильным:
/home/roman/.venvburrito/lib/python:
/home/roman/.virtualenvs/py27/lib/python2.7/site-packages
И установка, кажется, чтобы быть успешными тоже:
cd ~/.virtualenvs/py27/lib/python2.7/site-packages/facs-2.0dev-py2.7.egg/
(py27)$ ls
EGG-INFO facs.py facs.pyc facs.so utils/
Кажется, что нет __init__.py
файла фактически не копируются в каталог верхнего уровня но прикосновение к нему там или нет не влияет на поведение импорта, описанное выше.
Любые идеи? Заранее спасибо!
Вы пытались переименовать 'facs.so' в нечто другое? Попробуйте использовать другое имя для пакета и '.so' – Bakuriu
Файл' .so' генерируется при компиляции/установке модуля python, я сам его не создаю ... извините, если это было непонятно : -S – brainstorm