Внутренние ссылки субмодуля Python - они просто сумасшедшие? - PullRequest
3 голосов
/ 05 августа 2010

Извинения за преимущество для новичка.Я не могу разобраться с этим, и документы не помогают!

Рассмотрим следующую структуру каталогов:

spam.py
foo     / __init__.py
          ham.py
          eggs.py

со следующим кодом:

# __init__.py
# blank

# ham.py
print( "got ham!" )

# eggs.py
print( "got eggs, importing ham!" )
import foo.ham

Теперь, если я import foo.eggs внутри spam.py (!), Происходит правильная вещь, и все ссылки на модули работают.

НО

Если я пытаюсь выполнить eggs.pyЯ получаю ImportError: No module named foo.ham!Если я изменю импорт foo.ham на ham, то произойдет правильное ... но тогда я не смогу import foo.eggs!

Итак, как мне разработать eggs?Если я использую «неотмеченные» ссылки, я могу нормально развиваться, но не могу попробовать, потому что не могу import модуль!Если я использую полную ссылку foo.ham, я могу импортировать пакет, но не могу выполнить подмодуль для целей разработки!

Это просто сбой в архитектуре упаковки Python?Я делаю это неправильно?

Ответы [ 3 ]

1 голос
/ 05 августа 2010

Это похоже на работу: Вот структура каталогов:

~/test/kl% ls -R
.:
foo  spam.py

./foo:
eggs.py  eggs.pyc  ham.py  ham.pyc  __init__.py  __init__.pyc

Вот содержимое файла:

~/test/kl% cat spam.py 
import foo.eggs

~/test/kl% cd foo/
~/test/kl/foo% cat eggs.py
print( "got eggs, importing ham!" )
import ham

Мы можем импортировать ветчину из spam.py и foo /eggs.py:

~/test/kl% python spam.py 
got eggs, importing ham!
got ham!

Полезное правило, которое следует помнить: когда вы говорите python script.py, каталог, содержащий script.py, добавляется в начало sys.path, каталоги ищут модули.Вот почему python spam.py работает без изменений PYTHONPATH.

~/test/kl% python foo/eggs.py
got eggs, importing ham!
got ham!

Здесь ~ / test / kl / foo добавляется к sys.path.Это нормально, потому что eggs.py пытается import ham.Так как ham.py находится в ~/test/kl/foo, что в sys.path, Python находит это просто замечательно.

~/test/kl% cd foo
~/test/kl/foo% python eggs.py
got eggs, importing ham!
got ham!

Каталог ~ / test / kl не был в моей PYTHONPATH.

1 голос
/ 05 августа 2010

Родительский каталог для foo должен находиться в пути питона:

$ ls foo
eggs.py  ham.py  ham.pyc  __init__.py  __init__.pyc
$ python foo/ham.py
got ham!
$ python foo/eggs.py
got eggs, importing ham!
Traceback (most recent call last):
  File "foo/eggs.py", line 2, in <module>
    import foo.ham
ImportError: No module named foo.ham
$ PYTHONPATH=. python foo/eggs.py
got eggs, importing ham!
got ham!
0 голосов
/ 05 августа 2010

Это архитектура упаковки Python. Обычно модуль может импортировать модули либо из текущего каталога с точечной ссылкой, либо из каталога $ PYTHONPATH. Вы должны понимать, что ссылка на модуль - это просто относительный путь к этому модулю. Итак ... интерпретатор не может импортировать любой модуль, который не найден в файловой системе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...