Невозможно импортировать пакеты в зависимости от того, как и где запускаются скрипты - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь запустить некоторые из своих скриптов на 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 в порядке.

Я хотел бы знать, как я могу найти правильное решение этой проблемы.Есть ли способ отладки, какие пакеты доступны с какой точки, или я могу правильно импортировать родительскую папку?

...