Запуск Python программ в терминале

Это короткая инструкция по запуску Python программ в терминале (Unix) или cmd (Windows).

Запуск простой программы без зависимостей

Пусть у Вас есть некий Python файл script.py.

def main():
    print("Hello world!")

if __name__ == "__main__":
    main()

Чтобы запустить программу, необходимо открыть терминал (Windows: Powershell, macOS: Terminal).

Далее потребуется создать виртуальное окружение с помощью команды python -m venv venv и активировать его:

  1. Для Windows: .\venv\Scripts\activate.

  2. Для macOS: source venv\bin\activate.

Если на любом из этапов PowerShell выводит ошибку, связанную с отсутствием прав, Вам понадобится изменить политику выполнения. Выполните следующие два шага:

  1. Запустите PowerShell через опцию “Запуск от имени администратора”.

  2. Разрешить запуск скриптов Enable running unsigned scripts by entering:

set-executionpolicy remotesigned

Если у Вас возникнут любые другие проблемы во время активации окружения, попросите о помощи в чате курса.

После успешной активации в начале строки появится метка (venv).

Теперь можно запустить программу через команду python script.py и получить вывод Hello world!.

Данная команда будет работать без проблем, если её запуск происходит из той же папки, где находится script.py. Чтобы перейти в нужную папку, используйте комманду cd "path_to_directory" (в кавычках укажите нужный путь). Также можно вызвать .py файл, используя полный путь до этого файла. Например:

python "full_path_to_directory_with_script/script.py"

Если python не опознан как имя командлета, Вам понадобится установить Python. Инструкцию по установке можно найти в инструкции по подготовке к прохождению курса starting-guide-label.

Запуск программ с пользовательскими модулями

Попробуем запустить файл start.py для лабораторной работы. Для этого выполним следующие шаги:

  1. Перейти в папку проекта cd C:\Users\user\Documents\20XX-2-level-labs.

  2. Запустить нужный файл через относительный путь python lab_N_lab_name/start.py.

При запуске терминал выводит ошибку:

Traceback (most recent call):
   File ...., line 5 in <module>
      from lab_N_lab_name.main import lab_function
ModuleNotFoundError: No module named 'lab_N_lab_name'

Почему же? Когда мы запускаем данный файл в среде разработки, всё работает без проблем! Что не так с терминалом? Папка lab_N_lab_name никуда не исчезла, она всё ещё находится в нашей текущей папке.

Ответ на эти вопросы более замысловатый. Нам нужно понимать, как Python импортирует модули и библиотеки. Чтобы использовать скачанные библиотеки и импортированные модули, Python требуется знать положение их файлов. По умолчанию, Python знает несколько базовых мест, где хранятся эти файлы на компьютере.

Их можно увидеть при выполнении команды python -c "import sys;print(sys.path)". Среди них будут только стандартные папки, в которых Python будет пытаться искать библиотеки:

[
    '/Users/alexanderdemidovskij/.pyenv/versions/3.10.8/lib/python310.zip',
    '/Users/alexanderdemidovskij/.pyenv/versions/3.10.8/lib/python3.10',
    '/Users/alexanderdemidovskij/.pyenv/versions/3.10.8/lib/python3.10/lib-dynload',
    '/Users/alexanderdemidovskij/Documents/hse/2022-2-level-ctlr/venv/lib/python3.10/site-packages'
]

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

Чтобы решить эту проблему, Вам понадобится эксплицитно добавить путь до Ваших пользовательских зависимостей в этот список стандартных путей.

Рекомендуется добавить их в системную переменную PYTHONPATH через терминал:

  1. Для Windows: $env:PYTHONPATH = "$pwd;" + $env:PYTHONPATH.

  2. Для macOS: export PYTHONPATH=$pwd:$PYTHONPATH.

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

Теперь попробуйте запустить программу снова через python lab_N_lab_name/start.py.

Если всё работает корректно, поздравляем! У Вас есть шанс получить самую высокую оценку за лабораторную работу. Если нет, попросите о помощи в чате курса.