2013-03-01 1 views
2

Этого вопрос имеет некоторое сходство с:Пространство имен 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 файла фактически не копируются в каталог верхнего уровня но прикосновение к нему там или нет не влияет на поведение импорта, описанное выше.

Любые идеи? Заранее спасибо!

+0

Вы пытались переименовать 'facs.so' в нечто другое? Попробуйте использовать другое имя для пакета и '.so' – Bakuriu

+0

Файл' .so' генерируется при компиляции/установке модуля python, я сам его не создаю ... извините, если это было непонятно : -S – brainstorm

ответ

0

Будьте внимательны, если вы сначала импортируете файл, а не пакет facs. Вы запускаете свою консоль python поверх исходного каталога пакета facs?

Попытайтесь выйти за пределы каталога пакетов, и все будет иметь смысл.

Кроме того, рядом импорт не говорит, что все модули позади каталога FACS будут импортированы:

>> import facs 
>> dir (facs) 
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__'] 

Вы должны установить параметры импорта в каждом __init__.py файле, например, если вы хотите экспортировать некоторые simbols из файла .so при import facs, вы должны иметь следующее содержание в вашем __init__.py файле:

>> from _facs import function_name, function_name ..... 

А потом, когда вы import facs, он будет импортировать те функц для вас.

Возьмите тот же шаблон для ваших вспомогательных пакетов.

Я бы также порекомендовал вам переименовать ваш файл facs.so в файл _facs.so, чтобы избежать конфликтов имен между именем пакета и именем модуля.

+0

Здравствуйте, pfreixes! Приятно видеть тебя здесь! Я действительно использовал ваши предложения, но это, похоже, не исправляет мою проблему: _S: https://github.com/brainstorm/facs/commit/ffa1df9be3d8167c5d5ae4146bf4f8ae4273d8fe – brainstorm

+0

После совершения выше я получаю сообщение «Ошибка импорта: нет модуля названный facs ", поэтому я не могу загрузить ни один из символов: -/Еще раз спасибо за то, что посмотрели на это! : D – brainstorm

+0

Извините, но facs/__ init__.py должен быть "" "из facs._facs import ..." "" и это должно быть ... – pfreixes

Смежные вопросы