Я делаю пакет, и модули в этом пакете имеют код внутри блоков if __name__=='__main__':
для целей тестирования. Но мои попытки использовать относительный импорт в этих модулях вызывают ошибки.
Я прочитал эту тему и миллиард других: Относительный импорт в миллиардный раз
Прежде чем вы отметите это как дубликат, если то, что я хочу сделать, невозможно в Python3, тогда мой вопрос: почему это работает в Python2 и что мотивировало решение сделать это такой проблемой в Python3?
Это мой пример проекта Python:
mypackage
- module1.py
- module2.py
- __init__.py
__init__.py
и module2.py
пусты
module1.py
содержит:
import module2
# module1 contents
if __name__=="__main__":
# Some test cases for the contents of this module
pass
Это отлично работает в Python2. Я могу импортировать модуль1 из других проектов в любое место на своем компьютере, а также могу запускать модуль1 напрямую и запускать код в блоке if
.
Однако эта структура не работает в Python3. Если я попытаюсь импортировать модуль в другое место, это не удастся:
>>> from mypackage import module1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\_MyFiles\Programming\Python Modules\mypackage\module1.py", line 1, in <module>
import module2
ModuleNotFoundError: No module named 'module2'
Поэтому я попытался изменить первую строку на from . import module2
, и это исправило ее, чтобы я мог успешно импортировать модуль из любого места. Но затем, когда я пытаюсь запустить module1 напрямую как скрипт, я получаю эту ошибку:
Traceback (most recent call last):
File "C:/_MyFiles/Programming/Python Modules/mypackage/module1.py", line 1, in <module>
from . import module2
ImportError: cannot import name 'module2' from '__main__' (C:/_MyFiles/Programming/Python Projects/pgui/mypackage/module1.py)
Я не хочу открывать консоль и набирать python -m myfile
каждый раз, когда работаю над модулем и хочу запускать его непосредственно как скрипт.
Я хочу иметь возможность работать с модулями, не добавляя их родительскую папку в PYTHONPATH, используя относительный импорт, как в Python2.
Есть ли лучший обходной путь или решение этих проблем?
python -m myfile
каждый раз, когда работаю над модулем и хочу запускать его непосредственно как скрипт. - в отличие от того, что, открывая консоль и набираяpython myfile.py
? Как вы работаете с вашими файлами в настоящее время? (Также этоpython -m packagename.modulename
для подмодулей пакета, а неpython -m modulename
.) - person user2357112 supports Monica   schedule 02.02.2019if __name__='__main__' block?
» просто «Вы не можете - person pyjamas   schedule 03.07.2020