Я пытаюсь запустить некоторые из своих скриптов на Python, но в зависимости от того, где и как я их запускаю, они приводят к сбою с различными ошибками, и я не могу понять, как исправить свои импортные операции.
Как правильно проверить, какие пакеты импортируются, как и откуда?Прямо сейчас я отлаживаю скрипт и добавляю импорт - мне кажется, это довольно случайный подход.
Вот моя файловая структура:
Master
├── Testcases
│ ├── ATest.py
│ ├── __init__.py
│ ├── TestLinking.py
├── Handling
│ ├── Classes.py
│ ├── Functions.py
├── __init__.py
├── Database
│ ├── Debug.py
│ ├── ConnectionSupport.py
│ ├── Utils.py
│ ├── Initalisation.py
│ ├── __init__.py
│ ├── Database.py
│ ├── Tests.py
│ ├── TKMenu.py
├── unittests.py
Classes.py
содержит несколько классов: Handling
является одним из них.
Рабочий случай
Я могу проверить все с помощью unittests.py
.Он запускается из родительской папки и ведет себя как положено.Database.py
работает правильно, все операции импорта работают как надо.__init__.py
довольно прост, он содержит только from . import Handling
.
unittests.py
:
import Database
from Handling import Classes, Functions
import unittest
import os
suite = unittest.TestSuite()
loader = unittest.TestLoader()
suite.addTests(loader.loadTestsFromModule(Database.Tests))
if __name__ == '__main__':
runner = unittest.TextTestRunner()
runner.run(suite)
Не работает
Теперь я в папке Database.Я запускаю python3 Database.py
, и мне не удается в первой строке кода:
import Handling
с сообщением об ошибке:
Traceback (most recent call last):
File "Database.py", line 1, in <module>
import Handling
ModuleNotFoundError: No module named 'Handling'
Возвращение в корневую папку и выполнение его изтам дает тот же результат.
Во время процесса я обнаружил похожие ошибки, поэтому я попытался добавить все необходимое в __init.py__
:
import Handling
import Testcases
from . import Debug
from . import ConnectionSupport
from . import Utils
from . import Database
from . import Tests
from . import Initalisation
from . import TKMenu
После некоторых исследований я надеялся, чтоможет решить проблему, импортировав каталог sibling из моего Database.py
:
from .. import Handling
Но это просто дает мне более непрозрачную ошибку:
ValueError: attempted relative import beyond top-level package
Другие параметры, такие как from .. Handling import Handling
выдайте ту же ошибку.
Случай со смешанными чувствами
TKMenu.py
- это графический интерфейс для Database.py
.В настоящее время я использую следующий импорт, чтобы заставить его работать (запускаю TKMenu в своей папке):
try:
from Database.Database import Database #When called from the unittests we arrive here
except ModuleNotFoundError:
import Database #Opening it in its folder
Это работает, но я не удовлетворен тем, как это работает.Кроме того, он по-прежнему не работает, поскольку он поступает в строке 1 Database.py
.Тем не менее, запускать его из Unittests в порядке.
Я хотел бы знать, как я могу найти правильное решение этой проблемы.Есть ли способ отладки, какие пакеты доступны с какой точки, или я могу правильно импортировать родительскую папку?