Я попал в подобный сценарий, и меня это очень беспокоило, пока я не понял, как должен работать импорт модулей и пакетов.
Рассмотрим следующую структуру
mydir
- project
- __init__.py
- module1.py
- module2.py
Содержимое module1
и module2
выглядит следующим образом
module1.py
print("moudule1")
moudle2.py
с.import module1
print("Module 2")
if __name__ == '__main__':
print("Executed as script")
Теперь, если я открою repl вне каталога пакета и попытаюсь сделать импорт, он будет работать
Python 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from package import module2
Module 1
Module 2
>>> sys.path
['', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/home/rbhanot/.local/lib/python3.6/site-packages', '/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages']
Обратите внимание на sys.path
, как вы можете видетьсодержит текущий каталог, в котором я нахожусь в качестве первого элемента, что означает, что все мои операции импорта будут сначала найдены в моем текущем каталоге.
Теперь, если я зайду в каталог пакета, а затем открою repl и попробуюВыполнение одного и того же импорта. Посмотрите, что происходит*, так как я не смог найти ни одного, следовательно, импорт завершился неудачно.Но импорт module1 работает, потому что он находится в текущем каталоге.
Вне пакета я могу выполнить скрипт как
python3 -m package.module2 2 ↵
Module 1
Module 2
Executed as script
Хотя я могу выполнить скрипт, но это не такпредполагается использовать.Помните, что пакеты - это библиотека кода, которая должна использоваться совместно и не должна иметь никакого кода, который непосредственно исполняется через командную строку.Пакеты и модули внутри пакетов должны быть просто импортированы, и затем после импорта вы можете написать свои скрипты, которые выполняются через командную строку, добавив в них выражение __name__
.