2016-06-14 2 views
0

У меня есть проект Python, в котором я хочу использовать класс C++, который я открывал через Cython (действительно, мне просто нужен конкретный экземпляр класса, так как приведенный ниже код будет демонстрировать). Потому что была куча файлов, связанных с классом, я решил поместить его в свой собственный пакет.Импорт Cython подвергается классу из другого каталога

В __init__.py файл этого пакета, у меня есть то, что составляет следующий код:

from foo import Foo # import the class 

bar = Foo(some_parameters) 
__all__ = ["bar"] 

Это прекрасно работает, когда я бегу __init__.py сам по себе. Однако, когда я пытаюсь получить доступ к нему из-за пределов каталога:

from qux import bar # inside main.py in the parent directory 

Я получаю ошибку прослежена назад к же__init__.py:

File "D:\path\to\qux\\__init__.py", line 2, in <module> 
from foo import Foo 
ImportError: No module named 'foo' 

Напомним, что foo является файлом Cython, не чисто Код Python.

структура каталогов выглядит следующим образом:

main_project\ 
    main.py 
    (more supporting files here) 
    qux\ 
    __init__.py 
    cy_foo.cpp 
    cy_foo.pyx 
    foo.cpp 
    foo.h 
    foo.cp35-win_amd64.pyd 
    (more supporting files here) 

Что происходит?

ответ

1

Я не думаю, что это не имеет ничего общего с Cython само по себе, скорее, этот вопрос в связи с тем, что при выполнении main.py в каталоге верхнего уровня, Python выполнит __init__.py и поиск в том же каталоге, не суметь чтобы найти модуль foo внутри qux.

В качестве решения, изменить import заявление в __init__.py к:

from qux.foo import Foo 

Если по каким-то причинам вы все еще нужно запустить __init__.py как __main__ сценарий, вы можете использовать ой так знакомый if положение, чтобы проверить __name__:

if __name__ == "__main__": 
    from foo import Foo 
else: 
    from qux.foo import Foo 

bar = Foo("arguments") 
__all__ = ["bar"] 

Теперь, если запустить как __main__ модуль, __init__.py найдет foo, если нет, это позволяет другим найти его.

+0

Это было исправлено! Наверное, я пытался сделать эквивалент чего-то вроде «import scipy; от оптимизации импорта brentq' без квалификации 'optimize', принадлежащей' scipy'. Мне просто не приходило в голову, что Python все еще будет искать в верхнем каталоге при запуске скрипта в подкаталоге. –

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