упаковка Python для относительного импорта

Прежде всего: извините, я знаю, что было много вопросов об относительном импорте, но я просто не нашел решения. Если возможно, я бы хотел использовать следующую структуру каталогов:

myClass/
    __init__.py
    test/
        demo.py
        benchmark.py
        specs.py
    src/
        __init__.py
        myClass.py

Теперь мои вопросы:

  • Как тестовые файлы из пакета правильно импортируют myClass.py?

  • Как бы вы импортировали пакет извне, если вы берете myClass в качестве подмодуля в libs /myClass или include /myClass?

До сих пор я не мог найти элегантное решение для этого. Из того, что я понимаю, Решение Гвидо должно быть возможно сделать from ..src import myClass, но это приведет к ошибке:

ValueError: Attempted relative import in non-package

Который выглядит так, как будто он не рассматривает myClass как пакеты. Чтение документов :

  

Файлы __init__.py необходимы для того, чтобы Python рассматривал каталоги как содержащие пакеты;

Кажется, мне не хватает чего-то, что указывает, где находятся скрипты пакета, мне следует использовать .pth?

70 голосов | спросил eerne 3 FriEurope/Moscow2010-12-03T21:05:40+03:00Europe/Moscow12bEurope/MoscowFri, 03 Dec 2010 21:05:40 +0300 2010, 21:05:40

3 ответа


0
  

ValueError: Attempted relative import in non-package

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

Поэтому, если вы выполняете относительный импорт, например, в своих тестах, вы должны сделать свои тесты частью своего пакета. Это значит

  1. Добавление __init__.py для проверки /
  2. Запуск их из какого-либо внешнего скрипта, например, тестов носа

Если вы запускаете что-то как python myClass/test/demo.py, относительный импорт также не будет работать, так как вы запускаете демонстрационный модуль не как пакет. Для относительного импорта требуется, чтобы модуль, который их использует, импортировался сам как модуль пакета, from myClass.test.demo import blabla или с относительным импортом.

ответил Daniel Kluev 4 SatEurope/Moscow2010-12-04T06:15:48+03:00Europe/Moscow12bEurope/MoscowSat, 04 Dec 2010 06:15:48 +0300 2010, 06:15:48
0

После нескольких часов поисков прошлой ночью я нашел ответ об относительном импорте в python! Или, по крайней мере, простое решение. Лучший способ исправить это - вызвать модули из другого модуля. Скажем, вы хотите demo.py импортировать myClass.py , В папке myClass в корне подпакетов им нужен файл, который вызывает два других. Из того, что я собираю, рабочий каталог всегда считается __main__, так что если вы тестируете импорт из demo.py со скриптом demo.py, вы получите эту ошибку. Для иллюстрации:

Иерархия папок:

myClass/
    main.py #arbitrary name, can be anything
    test/
        __init__.py
        demo.py
    src/
        __init__.py
        myClass.py

myClass.py:

def randomMaths(x):
    a = x * 2
    y = x * a
    return y

demo.py:

from ..src import myClass

def printer():
    print(myClass.randomMaths(42))

main.py:

import test.demo

demo.printer()

Если вы запустите demo.py в интерпретаторе, вы выдадите ошибку, но запустите main.py не будет. Это немного запутанно, но это работает: D

ответил Sevvy325 23 Mayam12 2012, 07:59:34
0

Ссылки внутри пакета описывают, как ---- +: = 0 =: + ---- из myClass. Чтобы импортировать пакет извне, вы должны добавить его путь к переменной среды test/* перед запуском приложения-импортера или к PYTHONPATH в коде перед его импортом.

Почему sys.path терпит неудачу: вероятно, from ..src import myClass не является пакетом Python, вы не можете импортировать оттуда. Вы должны добавить его в путь Python, как описано выше.

ответил khachik 3 FriEurope/Moscow2010-12-03T21:19:57+03:00Europe/Moscow12bEurope/MoscowFri, 03 Dec 2010 21:19:57 +0300 2010, 21:19:57

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132