Как использовать импорт Python между сценариями в одной папке, импортированный как часть пакета и запускаемый как отдельный сценарий в папке - PullRequest
1 голос
/ 18 июня 2020

Я долгое время читал абсолютный и относительный импорт, и ничего не помогло.

Скажем, у меня есть модуль python, структурированный так:

└── test_project
    ├── __init__.py
    ├── script1.py
    ├── script2.py
    └── main.py
  • __init__.py пусто
  • script1.py имеет функции
  • script2.py обращается к скрипту1. Это может быть достигнуто с помощью from . import script1, import .script1 (относительное) или import script1 (абсолютное)
  • main.py - это сценарий, который запускает функцию из script1 в командной строке и, следовательно, включает if '__name__'==__main__: за которым следует некоторая версия import script1

Я хочу иметь возможность импортировать script2 в терминал python как вне, так и внутри папки и запускать скрипт main.py в командной строке как снаружи, так и внутри папки, т.е. python test_project/main.py.

Несмотря на множество попыток, я не могу найти способ написать команды импорта, чтобы import script2 работал во всех этих случаях.

Например, если я использую from . import script1 в main и script2 и запускаю from test_project import script2 в python извне папки, он работает нормально. Но если я запускаю python test_project/main.py или пытаюсь импортировать в python, находясь в папке, я получаю:

Traceback (most recent call last):
File "test_project/main.py", line 1, in <module>
    from . import script1
ImportError: attempted relative import with no known parent package

Я могу попытаться изменить импорт как абсолютный, чтобы исправить это. Например, чтобы main и script2 имели import script1, а не были относительными. Теперь запуск main и импорт из python в папке в порядке, но импорт извне папки с from test_project import script2 дает:

<ipython-input-1-c3cdbe7a7496> in <module>
----> 1 from test_project import script2
~/python/test_project/script2.py in <module>
----> 1 import script1
ModuleNotFoundError: No module named 'script1'

. Следовательно, невозможно написать операторы импорта в таком каким образом эти функции возможны?

...