2013-05-27 4 views
24

У меня есть следующая структура каталогов:Импортировать файл из родительского каталога?

application 
    tests 
     main.py 
    main.py 

приложение/main.py содержит некоторые функции.

тесты/main.py будут содержать мои тесты для этих функций, но я не могу импортировать главный уровень main.py. Я получаю следующее сообщение об ошибке:

ImportError: Import by filename is not supported. 

Я пытаюсь импортировать, используя следующий синтаксис:

import main 

Что я делаю неправильно?

+0

Я прочитал документацию первый: http://docs.python.org/2/tutorial /modules.html#packages – Blender

+0

Ну вы не можете импортировать то же имя файла, над которым работаете. – squiguy

+0

В каком файле вы выполняете 'import main'? – Aivar

ответ

4

Вы не можете импортировать файлы из родительских/родственных каталогов как таковых. Вы можете импортировать вещи только из каталогов на системном пути или в текущий каталог или в подкаталоги внутри пакета. Поскольку у вас нет файлов __init__.py, ваши файлы не образуют пакет, и вы можете импортировать их только путем их размещения по системному пути.

+1

Говорить без квалификации, что вы не можете быть немного сильным. Вы не можете сделать это без особых усилий, но все, что вам нужно сделать, - это установить родительский каталог на путь, и вы можете это сделать. –

+2

@BryanOakley: Это подпадает под то, что я сказал о «размещении их на системном пути». – BrenBarn

+0

+ после прохождения много SOQ я понял, что python слеп, чтобы искать в родительских каталогах. – sakhunzai

10

Вы должны добавить реж приложения на вашем пути:

import sys 
sys.path.append("/path/to/dir") 
from app import object 

или из оболочки:

setenv PATH $PATH:"path/to/dir" 

В случае, если вы используете окна: Добавление переменной в путь в windows.

Или из командной строки:

set PATH=%PATH%;C:\path\to\dir 
8

Прежде всего, вам нужно сделать каталоги в пакеты, добавляя __init__.py файлы:

application 
    tests 
     __init__.py 
     main.py 
    __init__.py 
    main.py 

Тогда вы должны убедиться, что каталог выше приложения находится на sys.path. Есть много способов сделать это, как сделать приложение infto пакета и установить его, или просто выполняя вещи в нужной папке и т.д.

Then your imports will work.

+6

Добавление '__init__.вы делаете свои каталоги в пакеты, а не модули. – raben

31

Если вы хотите сценарий быть более портативным, рассмотрите возможность поиска родительского каталога автоматически:

import os, sys 
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 
# import ../db.py 
import db 
1

in python. существует тот же каталог, .. для родительского каталога импортировать файл из родительского каталога, вы можете использовать ..

from .. import filename (without .py extension)

+1

Это не сработало для меня, «ValueError: Попытка относительного импорта в не-пакет» – nobism

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