Введение
В мире программирования на 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

Вы увидите вывод, подобный этому:
['/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).



