Как импортировать используя путь верхнего уровня в Python?

1

Я разрабатываю структуру python и хочу делать импорт на основе пакета верхнего уровня (название проекта). Пользователи будут использовать фреймворк, скопировав всю структуру и создав собственные модули.

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

myapp/
  config.py
  docs/
  framework/
    main.py
    utils.py
  file.py
  lib/
    some_module.py
  unit_tests/
    test_utils.py

Я хочу иметь возможность использовать следующий импорт в файлах python в lib и unit_tests следующим образом:

from myapp.framework import utils

Есть ли простой способ сделать это? Я пробовал делать sys.path.append() хаки, но они действительно не работают. Если есть действительно питонический способ достичь этого, я не против идти на дополнительные длины, чтобы заставить его работать.

EDIT: Ну, я снова попробовал sys.path.append(), и это действительно работает, но это действительно элегантное решение, и я действительно хотел бы услышать, есть ли другой способ.

  • 0
    Почему не работает sys.path.append() ?
  • 0
    @ire_and_curses - я не уверен, почему sys.path.append () не работал, поскольку я просто не смог достичь желаемого импорта, который хотел. Тем не менее, из моих исследований кажется, что добавление к пути не рекомендуется.
Показать ещё 1 комментарий
Теги:
package

2 ответа

1

Короче: вы не можете иметь два модуля с тем же именем один внутри другого. У вас есть папка myapp и файл myapp.py

Это из-за порядка импорта модулей.

  • Внутри текущего каталога
  • Текущий пакет
  • Глобальная папка пакета

Итак, если вы пытаетесь import myapp.lib.some_module в config.py, интерпретатор сначала увидит, что у вас есть myapp.py в той же папке и буквально попробуйте импортировать lib.some_module из этого файла, чего не существует.

Будет ли что-то пытаться импортировать myapp.myapp.lib.some_module извне этого модуля.

Итак, самое лучшее, что вам нужно сделать, это переименовать файл myapp.py

  • 0
    К сожалению, файл myapp.py должен был быть файлом-заполнителем, чтобы показать, что есть другие файлы. Это на самом деле не присутствует в рамках. Я отредактирую это вне вопроса.
  • 0
    Я видел эту проблему раньше, поэтому я подумал, что это действительно имя файла ...
-3

В чем проблема? Это стандартный пакет, и это должно работать из коробки? Почему вы хотите что-либо с помощью sys.path.append() здесь? Сделайте свой материал подходящим пакетом Python с его собственным setup.py, установите и разверните его правильно и используйте его, как и любой другой пакет.... где ваша РЕАЛЬНАЯ проблема???? И что "пользователи будут использовать фреймворк, копируя всю структуру и записывая свои собственные модули внутри". имею в виду? Пользователь должен установить пакет правильно, как и все остальные, с помощью easy_install, pip или распространения. Вот почему у нас есть эти инструменты.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню