Как проверить системный путь Python для поиска необходимых модулей

PythonBeginner
Практиковаться сейчас

Введение

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

Понимание Python Path (Пути Python)

Python path (путь Python), также известный как sys.path, представляет собой список каталогов, в которых Python выполняет поиск при попытке импортировать модуль. Это важная концепция для понимания, поскольку она определяет, где Python будет искать необходимые модули и пакеты (packages) при запуске вашего кода.

Что такое Python Path?

Python path (путь Python) — это список каталогов, в которых Python выполняет поиск при попытке импортировать модуль. Когда вы импортируете модуль в свой код Python, Python ищет модуль в каталогах, указанных в списке sys.path.

Список sys.path обычно включает следующие каталоги:

  • Каталог, содержащий входной скрипт (скрипт, который вы запускаете)
  • Переменная окружения PYTHONPATH (если она установлена)
  • Зависящие от установки каталоги по умолчанию для стандартных библиотек и site-packages.

Вы можете просмотреть текущий Python path (путь Python), используя атрибут sys.path в своем коде Python. Давайте создадим простой скрипт Python, чтобы увидеть это в действии.

Откройте терминал WebIDE и перейдите в каталог своего проекта, если вы еще этого не сделали. Каталог по умолчанию — /home/labex/project.

Теперь создайте новый файл с именем check_path.py в каталоге /home/labex/project с помощью редактора WebIDE.

Добавьте следующий код в файл check_path.py:

import sys
print(sys.path)

Сохраните файл.

Теперь запустите скрипт из терминала:

python check_path.py
Output of checking Python path

Вы увидите вывод, подобный этому:

['/home/labex/project', '/usr/lib/python310.zip', '/usr/lib/python3.10', '/usr/lib/python3.10/lib-dynload', '/home/labex/.local/lib/python3.10/site-packages', '/usr/local/lib/python3.10/dist-packages', '/usr/lib/python3/dist-packages']

Этот вывод показывает список каталогов, в которых Python выполнил поиск при запуске скрипта. Первая запись — это каталог, в котором находится скрипт (/home/labex/project). Остальные записи — это стандартные каталоги библиотек Python и site-package.

Понимание структуры Python Path

Python path (путь Python) структурирован как список каталогов. Каждый каталог в списке представляет собой место, где Python будет искать модули и пакеты (packages). Порядок каталогов в списке важен, поскольку Python будет искать каталоги в том порядке, в котором они появляются в списке.

Например, если у вас есть пользовательский модуль (custom module), расположенный в каталоге /path/to/my/module, и вы хотите импортировать этот модуль в свой код Python, вам необходимо убедиться, что каталог /path/to/my/module включен в Python path (путь Python).

graph TD A[Python Script] --> B[sys.path] B --> C[/home/labex/project] B --> D[/usr/lib/python3.10/site-packages] B --> E[/usr/lib/python3.10] B --> F[/home/labex/.local/lib/python3.10/site-packages]

На диаграмме выше скрипт Python пытается импортировать модуль, а список sys.path содержит несколько каталогов, в которых Python будет искать модуль.

Проверка Python Path с помощью модуля site

На предыдущем шаге вы использовали sys.path, чтобы увидеть каталоги, в которых Python выполняет поиск. Другим полезным модулем для понимания того, где Python ищет пакеты (packages), в частности site-packages (сторонние пакеты, установленные через pip), является модуль site.

Функция site.getsitepackages() возвращает список каталогов, в которых Python будет искать site-packages.

Давайте изменим скрипт check_path.py, чтобы также использовать модуль site.

Откройте файл check_path.py в редакторе WebIDE.

Добавьте следующие строки в скрипт после существующего кода:

import site

print("\nsite.getsitepackages():")
print(site.getsitepackages())

Теперь полный файл check_path.py должен выглядеть так:

import sys
import site

print("sys.path:")
print(sys.path)

print("\nsite.getsitepackages():")
print(site.getsitepackages())

Сохраните файл.

Теперь снова запустите скрипт из терминала:

python check_path.py

Вы увидите вывод, подобный этому:

sys.path:
['/home/labex/project', '/usr/lib/python310.zip', '/usr/lib/python3.10', '/usr/lib/python3.10/lib-dynload', '/home/labex/.local/lib/python3.10/site-packages', '/usr/local/lib/python3.10/dist-packages', '/usr/lib/python3/dist-packages']

site.getsitepackages():
['/home/labex/.local/lib/python3.10/site-packages', '/usr/local/lib/python3.10/dist-packages', '/usr/lib/python3/dist-packages']

Обратите внимание, что вывод site.getsitepackages() является подмножеством каталогов в sys.path. site.getsitepackages() конкретно показывает места, где обычно устанавливаются сторонние пакеты (third-party packages).

Используя как sys.path, так и site.getsitepackages(), вы получаете более полное представление о том, где Python ищет модули и пакеты (packages) в вашей системе.

Временное изменение Python Path (Пути Python)

В некоторых случаях может потребоваться добавить каталог в Python path (путь Python) для конкретного скрипта или сеанса. Это полезно, когда вы разрабатываете пользовательский модуль (custom module) или используете модуль, который не установлен в стандартном Python path (пути Python).

Вы можете временно изменить Python path (путь Python) в запущенном скрипте, используя sys.path.append().

Давайте создадим новый каталог и простой модуль в нем, чтобы продемонстрировать это.

В терминале создайте новый каталог с именем my_custom_modules в каталоге вашего проекта:

mkdir /home/labex/project/my_custom_modules

Теперь создайте новый файл с именем my_module.py внутри каталога my_custom_modules с помощью редактора WebIDE.

Добавьте следующий код в my_module.py:

def greet(name):
  return f"Hello, {name} from my_module!"

Сохраните файл.

Затем создайте новый скрипт Python с именем use_custom_module.py в каталоге /home/labex/project.

Добавьте следующий код в use_custom_module.py:

import sys
import os

## Get the absolute path to the custom modules directory
custom_modules_path = os.path.join(os.path.dirname(__file__), 'my_custom_modules')

## Add the custom modules directory to sys.path
sys.path.append(custom_modules_path)

## Now you can import my_module
import my_module

message = my_module.greet("LabEx User")
print(message)

## Optional: Print sys.path again to see the added directory
print("\nUpdated sys.path:")
print(sys.path)

Сохраните файл.

В этом скрипте мы сначала создаем абсолютный путь к каталогу my_custom_modules, используя os.path.join и os.path.dirname(__file__). Это делает скрипт более переносимым. Затем мы используем sys.path.append(), чтобы добавить этот каталог в Python path (путь Python). После добавления каталога мы можем успешно импортировать my_module.

Запустите скрипт из терминала:

python use_custom_module.py

Вы должны увидеть вывод, подобный этому:

Hello, LabEx User from my_module!

Updated sys.path:
['/home/labex/project', '/usr/lib/python310.zip', '/usr/lib/python3.10', '/usr/lib/python3.10/lib-dynload', '/home/labex/.local/lib/python3.10/site-packages', '/usr/local/lib/python3.10/dist-packages', '/usr/lib/python3/dist-packages', '/home/labex/project/my_custom_modules']

Вывод показывает, что функция greet из my_module была успешно вызвана, и каталог my_custom_modules был добавлен в sys.path для выполнения этого скрипта.

Этот метод изменения sys.path является временным и влияет только на выполнение текущего скрипта.

Постоянное изменение Python Path (Пути Python) с помощью PYTHONPATH

В то время как изменение sys.path внутри скрипта полезно для временных изменений, вам может потребоваться добавить каталог в Python path (путь Python) для всех ваших сеансов Python или для конкретного проекта, не изменяя отдельные скрипты. Это можно сделать, установив переменную окружения PYTHONPATH.

Переменная окружения PYTHONPATH — это список каталогов, которые Python добавляет в sys.path при запуске.

Чтобы установить переменную окружения PYTHONPATH для текущего сеанса терминала, вы можете использовать команду export.

Давайте удалим строку sys.path.append() из use_custom_module.py и вместо этого будем использовать PYTHONPATH.

Откройте use_custom_module.py в редакторе WebIDE и удалите следующие строки:

## Get the absolute path to the custom modules directory
custom_modules_path = os.path.join(os.path.dirname(__file__), 'my_custom_modules')

## Add the custom modules directory to sys.path
sys.path.append(custom_modules_path)

Теперь файл use_custom_module.py должен выглядеть так:

import sys
import os

## Now you can import my_module
import my_module

message = my_module.greet("LabEx User")
print(message)

## Optional: Print sys.path again to see the added directory
print("\nUpdated sys.path:")
print(sys.path)

Сохраните файл.

Теперь попробуйте запустить скрипт без установки PYTHONPATH:

python use_custom_module.py

Скорее всего, вы получите ModuleNotFoundError, потому что Python не может найти my_module.

Traceback (most recent call last):
  File "/home/labex/project/use_custom_module.py", line 5, in <module>
    import my_module
ModuleNotFoundError: No module named 'my_module'

Теперь давайте установим переменную окружения PYTHONPATH в терминале, чтобы включить наш каталог пользовательских модулей (custom modules directory). Убедитесь, что вы находитесь в каталоге /home/labex/project.

export PYTHONPATH="/home/labex/project/my_custom_modules:$PYTHONPATH"

Эта команда добавляет /home/labex/project/my_custom_modules в начало переменной PYTHONPATH. $PYTHONPATH в конце гарантирует, что все существующие каталоги в PYTHONPATH будут сохранены.

Теперь снова запустите скрипт use_custom_module.py в том же сеансе терминала:

python use_custom_module.py

Вы должны увидеть вывод, указывающий на то, что модуль был найден и выполнен:

Hello, LabEx User from my_module!

Updated sys.path:
['/home/labex/project', '/home/labex/project/my_custom_modules', '/usr/lib/python310.zip', '/usr/lib/python3.10', '/usr/lib/python3.10/lib-dynload', '/home/labex/.local/lib/python3.10/site-packages', '/usr/local/lib/python3.10/dist-packages', '/usr/lib/python3/dist-packages']

Обратите внимание, что /home/labex/project/my_custom_modules теперь включен в sys.path, потому что мы установили переменную окружения PYTHONPATH.

Установка PYTHONPATH в терминале с помощью export влияет только на текущий сеанс терминала. Чтобы сделать изменение постоянным, обычно добавляют команду export в файл запуска вашей оболочки (shell) (например, ~/.bashrc, ~/.zshrc). Однако для этой лабораторной работы достаточно установить ее в текущем сеансе, чтобы продемонстрировать концепцию.

Итог

В этой лабораторной работе вы узнали, как проверять и изменять системный путь Python (sys.path). Вы использовали sys.path и site.getsitepackages() для просмотра каталогов, в которых Python ищет модули. Вы также изучили два метода добавления каталогов в Python path (путь Python): временно внутри скрипта с помощью sys.path.append() и более постоянно для сеанса с использованием переменной окружения PYTHONPATH. Понимание и управление Python path (путем Python) является фундаментальным навыком для организации ваших проектов Python и обеспечения того, чтобы ваш код мог находить необходимые модули и пакеты (packages).