2016-01-03 5 views
2

У меня есть структура каталогов проекта:Проблема импорта расширение скомпилирован с numpy.distutils

myproject/ 
    setup.py 
    myproject/ 
    editors/ 
     .... 
    utilities/ 
     ... 
     find_inf.f90 

Все файлы проекта являются питона, для одного FORtran файла, который я указано иное. Теперь я могу использовать setuptools для установки моего проекта без файла fortran просто отлично, но для включения файла fortran я должен использовать numpy.distutils.core.Extension. Таким образом, у меня есть настройки файлов, как это:

from setuptools import find_packages 
from numpy.distutils.core import Extension 

ext1 = Extension(name = 'myproject.find_inf', 
       sources = ['myproject/utilities/find_inf.f90'], 
       extra_f90_compile_args=['-fopenmp',], 
       libraries=['gomp']) 

if __name__ == "__main__": 
    from numpy.distutils.core import setup 
    setup(name = 'myproject', 
      packages=find_packages(), 
      package_data={ 
       ...... 
      }, 
      entry_points={ 
       'console_scripts': [....] 
      }, 

      ext_modules = [ext1] 
     ) 

Это создает и устанавливает myproject-2.0-py2.7-macosx-10.6-x86_64.egg в каталоге site-packages и структура каталогов выглядит следующим образом:

myproject-2.0-py2.7-macosx-10.6-x86_64.egg 
     myproject 
      editors\ 
      find_inf.pyc 
      find_inf.so.dSYM/ 
      find_inf.py 
      find_inf.so* 
      __init__.py 
      __init__.pyc 

Так он смотрит на меня, что я должен быть в состоянии импорт find_inf из myproject. Но я не могу! Запись from myproject import find_inf создает ошибку импорта. Что я делаю не так?

UPDATE:

Если я случайно имя расширения от my project.find_inf только find_inf то установка ставит расширение непосредственно в myproject-2.0-py2.7-macosx-10.6-x86_64.egg. Если тогда я вручную перемещаю файлы find_inf оттуда до myproject-2.0-py2.7-macosx-10.6-x86_64.egg/myproject, тогда я могу импортировать расширение. Я до сих пор не могу понять это. Что-то явно не так в моем setup.py, что не поставив расширение в нужном месте ....

UPDATE: Фигурные его. Ответ ниже.

+0

Можете ли вы показать трассировку. –

+0

отслеживающий довольно лаконична, это просто: '' ImportError Traceback (самый последний вызов последнего) в () ----> 1 из MyProject импорта find_inf ImportError: не может импортировать имя find_inf'' – deepak

+0

Действительно ли 'find_inf.f90' действительно находится в' myproject', а не в подкаталоге? –

ответ

0

Хорошо, понял. Аргумент name= для Extension должен был быть name=myproject.utilities.find_inf.

Причина: Так что вопрос в том, что не существует пакет с именем myproject.find_inf что setup() осознает. Аргумент packages= для установки получает имена пакетов (в виде списка), а myproject.find_inf не было в списке, потому что в моем проекте под названием find_inf нет директории (как показывает структура каталогов в моем вопросе). This answer проливает важный свет на эту проблему. Для того, чтобы иметь скомпилированные расширения, помещенные под соответствующим суб-пакета, нужно:

  1. эти суб-пакеты, которые присутствуют в структуре каталогов источника
  2. __init__.py файлы должны существовать в этих пакетах, и
  3. имена этих пакетов должны быть переданы в аргумент packages= в setup().

То есть простое описание иерархии расширения в вызове Extension() недостаточно.