Абсолютный и относительный импорт не работает для пользовательского пакета - PullRequest
1 голос
/ 02 мая 2020

У меня есть пакет (или, как мне кажется, должен быть пакет) со структурой каталогов:

Switch/
    tests/
        testing.py
    Sw.py
    #otherfiles

Я пытаюсь импортировать Sw.py из testing.py. Я пробовал несколько вещей, в том числе from .. import Sw, import ..Sw, from Switch import Sw и несколько других вариантов. Я пробовал это с и без и __init__.py файл в каталоге Switch и в каталоге tests. Основная ошибка, которую я получаю:

Traceback (most recent call last):
  File "tests/testing.py", line 10, in <module>
    from .. import Sw
ImportError: attempted relative import with no known parent package

Хотя я также получаю синтаксические ошибки при попытке import ..Sw и ModuleNotFoundError: No module named 'Switch' при попытке from Switch import Sw.

Я сделал все возможное, чтобы убедиться, что ни один из каталогов в пакете не находится в пути или в pythonpath, хотя я на WSL и работаю Python, установленную на Windows, поэтому пути несколько сложный.

Когда я go в каталог выше Switch и запускаю python -c "import Switch.Sw", он работает правильно, но внутри каталога Switch он отвечает ModuleNotFoundError: No module named 'Switch'

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Используйте этот код, чтобы go создать каталог, и тогда вы сможете импортировать из своего пакета

import os, sys
dir_path = os.path.dirname(os.path.realpath(__file__))
parent_dir_path = os.path.abspath(os.path.join(dir_path, os.pardir))
sys.path.insert(0, parent_dir_path)

Я знаю, что это громоздко, но я не уверен, что есть лучшее решение.

0 голосов
/ 03 мая 2020

Я выяснил, что проблема заключалась в том, что я запускал файл как скрипт или свою команду как скрипт python -c "import Sw" рассматривает "import Sw" как скрипт, поэтому относительный и абсолютный импорт не работает. Он не рассматривал Sw как часть пакета, а был только отдельным модулем. Этот вопрос прояснил ситуацию для меня. Я должен был сделать python -m Switch.Sw.

...