LINUX.ORG.RU

[Python] packages

 


0

2

Возник вопрос с пакетами. Например есть такая структура проекта:

md/
    __init__.py
    main.py
    d1/
        __init__.py
        manage.py
        test.py

Теперь мне необходимо получить из main.py модуль manage.py, тут все просто:

from d1 import manage

И вот возникает вопрос, например manage.py импортирует test.py:

import test

Но но теперь при запуске main.py выдает ошибку что test.py не находится. Хорошо, тогда в manage.py делаем так:

from d1 import test

Отлично main.py у нас запускается, но теперь мы не можем работать с manage.py напрямую... Единственное что придумал это такая конструкция в manage.py

try:
    from d1 import test
except ImportError:
    import test

Теперь все отлично в обоих случаях, но мне это кажется странным, может я что-то не так делаю или есть вариант сделать это красивее? Доки читал, ответа на свой вопрос не нашел.


да ты гонишь - все работает

$ ls -R md
md:
d1  __init__.py  main.py

md/d1:
__init__.py  __init__.pyc  manage.py  manage.pyc  test.py  test.pyc

$ ./md/main.py 
TESTxTEST

$ ./md/d1/manage.py 
TESTxTEST

$ cat md/main.py 
#!/usr/bin/python

from d1 import manage

if __name__ == '__main__':
    print manage.x()

$ cat md/d1/manage.py
#!/usr/bin/python

import test

def x():
    return test.test('x')

if __name__ == '__main__':
    print x()

$ cat md/d1/test.py
def test(x):
    return 'TEST' + x + 'TEST'

python-2.7, linux

hatefu1_dead
()
Ответ на: комментарий от hatefu1_dead

аналогично при запуске из md ./main.py и ./d1/manage.py и из md/d1 ./manage.py

hatefu1_dead
()

Смешанные импорты были одним из дурацких решений в py2. Слава богу, в третьей версии это поправили.

baverman ★★★
()
Ответ на: комментарий от val-amart

На «import .test» выдает ошибку синтаксиса, а на «from . import test», если запускать его как __main__ то выдает «ValueError: Attempted relative import in non-package»

Gr1N
() автор топика
Ответ на: комментарий от Gr1N

> Python 3.2.2 дистр Arch

Запусти интерактивный интерпретатор в каталоге d1, дай команду import .test и запости сюда вывод.

дистр Arch

Я знал, я знал.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner
[gr1n@arch d1]$ python
Python 3.2.2 (default, Sep  5 2011, 04:33:58) 
[GCC 4.6.1 20110819 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import .test
  File "<stdin>", line 1
    import .test
           ^
SyntaxError: invalid syntax
>>>
Gr1N
() автор топика
Ответ на: комментарий от tailgunner

>Запусти интерактивный интерпретатор в каталоге d1, дай команду import .test и запости сюда вывод.

А зачем ты советуешь разобраться в импортах питона 3, а сам в них не разобрался?

http://www.python.org/dev/peps/pep-0328/#guido-s-decision

«Relative imports must always use from <> import; import <> is always absolute. Of course, absolute imports can use from <> import by omitting the leading dots. The reason import .foo is prohibited is because after...<skip>»

anonymous
()
Ответ на: комментарий от anonymous

> А зачем ты советуешь разобраться в импортах питона 3,

Потому что ТС использует Python3.

а сам в них не разобрался?

Я не пользуюсь Py3 и поэтому не имею рабочего знания о его новых фишках.

http://www.python.org/dev/peps/pep-0328/#guido-s-decision

И? Ты пришел сюда упрекнуть меня в том, что я мало знаю о Py3, или чтобы ответить на вопрос?

tailgunner ★★★★★
()
Ответ на: комментарий от Gr1N

> если запускать его как __main__ то выдает «ValueError: Attempted relative import in non-package»

стоп. а если не как мейн, то работает?

val-amart ★★★★★
()
Ответ на: комментарий от Gr1N

import .test

Относительный импорт возможен только через «from ... import», в твоем случае это будет

from . import test
baverman ★★★
()
Ответ на: комментарий от Gr1N

а на «from . import test», если запускать его как __main__ то выдает «ValueError: Attempted relative import in non-package»

Так и должно быть. Просто, сделай запускающий скрипт, который расположен вне пакета. Если делаешь законченное приложение, то distribute может это автоматизировать.

baverman ★★★
()
Ответ на: комментарий от tailgunner

>И? Ты пришел сюда упрекнуть меня в том, что я мало знаю о Py3, или чтобы ответить на вопрос?

Ни в коем случае. Что ты такой агрессивный?:)

Я просто хотел намекнуть, что ты коротко и жестко советуешь разобраться в py3, а сам предлагаешь человеку писать import .test, что является неправильной конструкцией. И ещё что-то там на какой-то арч сваливаешь потом.

anonymous
()
Ответ на: комментарий от anonymous

> Я просто хотел намекнуть, что ты коротко и жестко советуешь разобраться в py3, а сам предлагаешь человеку писать import .test

Я не предлагал этого %) Но да, меня удивило, что это не сработало.

tailgunner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.