Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > import файлов находящихся в соседней папке


Автор: zloyGamer 13.6.2010, 23:57
добрый вечер всем

подскажите как для такой структуры каталогов/файлов :
Цитата

    myFunc2\__init__.py
    myFunc2\testmod2.py
    prj\myFunc1\__init__.py
    prj\myFunc1\testmod1.py
    prj\myFunc1\testmod1.pyc
    prj\__init__.py
    prj\prj0.py
    __init__.py


из "prj\prj0.py" импортировать обьекты "myFunc2\testmod2.py"

если в "prj\prj0.py" прописать:
from myFunc1.testmod1 import *  # - тут все ок!

#а если так:
from ..myFunc2.testmod2 import *
#или так:
from ...myFunc2.testmod2 import *
то ошибка: ValueError: Attempted relative import in non-package

все файлы __init__.py - пустые,
вроде все делал как 
http://ru.wikibooks.org/wiki/%D0%A3%D1%87%D0%B5%D0%B1%D0%BD%D0%B8%D0%BA_Python_3.1#.D0.A1.D1.81.D1.8B.D0.BB.D0.BA.D0.B8_.D0.B2.D0.BD.D1.83.D1.82.D1.80.D0.B8_.D0.BF.D0.B0.D0.BA.D0.B5.D1.82.D0.B0 написано, но безрезультатно.

Автор: scorpil 14.6.2010, 01:01
Цитата

Обратите внимание, что относительное импортирование основано на имени текущего модуля. Поскольку имя главного модуля всегда „__main__“, модули, предназначенные для использования в качестве главных модулей приложения на Python, должны всегда использовать абсолютное импортирование (absolute imports).


Читать надо внимательно.
Но все же в Python 2.6 есть один способ. Если очень надо смотри http://python.org/dev/peps/pep-0366/. Я не разбирался.

Автор: zloyGamer 14.6.2010, 09:58
нда..., scorpil вы открыли мне глаза ), 
тоесть получается в Python31 уже никак нельзя просто включить/импортнуть модуль из соседней папки?
это както дико, жестко ограничивает и подталкивает к написанию велосипедов/костылей, 
а может у кого завалялся/есть какой нить ручной вариант импорта?

Автор: scorpil 14.6.2010, 17:56
Опять...
Цитата

модули, предназначенные для использования в качестве главных модулей приложения на Python, должны всегда использовать абсолютное импортирование (absolute imports).


Добавить модуль можно. Нельзя сделать это с помощью родственного импортирования, и только.

Было бы довольно смешно если бы в современный язык программирования непозволял сделать такую простую "махинацию".
Не советовал бы вам нарушать древовидную архитектуру программы, но если очень надо - перед импортом просто добавьте адрес нужной папки в переменную sys.path. Например:
Код

import sys
sys.path.append('../myFunc2')

import testmod2


Должно помочь.

Автор: zloyGamer 15.6.2010, 06:42
да, спс, я пока так и сделал
Код

import sys

from myFunc1.testmod1 import *

sys.path.insert(0, "..")
from myFunc2.testmod2 import * 
sys.path.pop(0)  #убираем за собой

но, это не вариант

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)