Module (56%)
Section (45%)

Ваш первый модуль: шаг 11

Пришло время усложнить этот пример - мы предположили, что основной файл Python находится в той же папке/каталоге, что и импортируемый модуль.

Давайте оставим это предположение и проведем следующий мысленный эксперимент:

  • мы используем операционную систему Windows ® (это предположение важно, так как от него зависит форма имени файла);
  • основной скрипт Python находится в C:\Users\user\py\progs под именем main.py;
  • модуль для импорта расположен в C:\Users\user\py\modules.
How Python seeks modules – modules access tree

Как с этим работать?

Чтобы ответить на этот вопрос, нам нужно поговорить о том, как Python ищет модули. Существует специальная переменная (фактически список), в которой хранятся все местоположения (папки/каталоги), в которых выполняется поиск, чтобы найти модуль, запрошенный инструкцией импорта.

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

В противном случае будет учитываться первая папка, содержащая модуль с нужным именем (если в какой-либо из оставшихся папок содержится модуль с таким именем, она будет проигнорирована).

Переменная называется path и доступна через модуль с именем sys. Вот как вы можете проверить его обычное значение:

import sys for p in sys.path: print(p)

Мы запустили код внутри папки C:\User\user, и вот, что мы получили:

C:\Users\user C:\Users\user\AppData\Local\Programs\Python\Python36-32\python36.zip C:\Users\user\AppData\Local\Programs\Python\Python36-32\DLLs C:\Users\user\AppData\Local\Programs\Python\Python36-32\lib C:\Users\user\AppData\Local\Programs\Python\Python36-32 C:\Users\user\AppData\Local\Programs\Python\Python36-32\lib\site-packages

sample output

Примечание: папка, в которой начинается выполнение, указана в первом элементе path.

Еще раз обратите внимание: в качестве одного из элементов path указан zip-файл - это не ошибка. Python может обрабатывать zip-файлы как обычные папки - это может сэкономить много места для хранения.

Знаете ли Вы, как мы можем решить эту проблему?

Мы можем добавить папку, содержащую модуль, в переменную path (она полностью модифицируемая).



Ваш первый модуль: шаг 12

Одно из нескольких возможных решений выглядит следующим образом:

Updating the main.py file with path.append('..\\modules')

from sys import path path.append('..\\modules') import module zeroes = [0 for i in range(5)] ones = [1 for i in range(5)] print(module.suml(zeroes)) print(module.prodl(ones))

main.py

Примечание:

  • мы удвоили \ внутри имени папки - знаете почему?


  • мы использовали относительное имя папки - это будет работать, если Вы запустите файл main.py непосредственно из его домашней папки, и не будет работать, если текущий каталог не соответствует относительному пути; Вы всегда можете использовать абсолютный путь, например:

    path.append('C:\\Users\\user\\py\\modules');

  • мы использовали метод append() - по сути, новый путь будет занимать последний элемент в списке путей; если Вам не нравится идея, Вы можете использовать вместо него метод insert().