Программируя в Python в определённый момент функциональности стандартной библиотеки становится недостаточно и приходится прибегать к установке сторонних пакетов-библиотек. В Python для этого используется менеджер установки пакетов pip (для Python3 соответственно pip3). Пока проект всего один, всё идёт хорошо, однако в какой-то момент оказывается, что в другом проекте нужен такой же пакет, как уже есть, только другой версии. Такое случается, когда библиотеки активно развиваются и в какой-то момент перестают поддерживать обратную совместимость. В таком случае, можно удалить текущую версию и поставить ту, в которой всё работает. Увы, такое случается довольно редко. В реальности скорее всего необходимо иметь две разных версии одного пакета одновременно.
Для решения конфликта версий был придуман механизм виртуальных окружений virtualenv (virtual environments). С его помощью можно создать виртуальную среду, в которую можно устанавливать пакеты независимо от основной среды или других виртуальных окружений. Для простоты можно считать, что venv создаёт внутри проекта каталог, в который добавляет нужную версию Python и устанавливает все используемые пакеты для приложения. В результате получается рабочее, изолированное и переносимое окружение.
Устанавливаем менеджер пакетов pip (если ещё не установлен). Чтобы иметь возможность устанавливать пакеты в Python, необходимо установить пакетный менеджер pip. Делается это с помощью следующей команды:
sudo apt install python3-pip
Устанавливаем пакет виртуального окружения virtualenv. С помощью только что установленного менеджера пакетов ставим пакет virtualenv:
# системно apt install python3.10-venv # для отдельного пользователя sudo pip3 install virtualenv
Создаем окружение:
python3 -m venv venv
Запускаем окружение. Слева в приглашении командной строки появится (venv):
$ source venv/bin/activate (venv) darkfire@dieg:~/project$
Далее устанавливаем зависимости, ниже пример листинга:
cat requirements.txt aiogram==2.15 pandas==1.3.0 tabulate==0.8.9
pip install --upgrade pip $ pip install -r requirements.txt
Напишем простой телеграм бот, который просто будет выводить кликабельную кнопку. Запускать бота будем от отдельного пользователя appuser.
import telebot from telebot import types bot = telebot.TeleBot("token") @bot.message_handler(commands=['start']) def url(message): markup = types.InlineKeyboardMarkup() btn1 = types.InlineKeyboardButton(text = "Hosting Consultant", url= "https://dieg.info/proverennye-hostingi-dlya-sayta/") markup.add(btn1) bot.send_message(message.from_user.id, "Click the button to go to the site", reply_markup = markup) bot.polling(none_stop=True, interval = 0)
Зависимости бота в requirements.txt:
(venv) root@z:~/apppythonbot# cat requirements.txt pyTelegramBotAPI==4.16.1
Ниже по листингу думаю все понятно. Создаем пользователя appuser, создаем папку с ботом, устанавливаем Python зависимости нашего бота для пользователя appuser.
useradd -m appuser su - appuser cd apppythonbot/ python3 -m venv venv appuser@z:~/apppythonbot$ source venv/bin/activate (venv) appuser@z:~/apppythonbot$ pip install -r requirements.txt
Для начала рассмотрим простые методы запуска скрипта в фоне, который не требует создания конфигурационных файлов. Однако если сервер будет перезагружен или во время работы скрипта возникнет ошибка, бот будет нужно запустить заново.
Расширенные настройки утилиты nohup описаны в статье: Использование nohup в Linux для запуска скриптов в фоновом режиме.
nohup python3 pythonbot.py &
Для простого запуска скрипта в фоне можно воспользоваться утилитой screen, которая позволяет создавать неограниченное количество сессий в терминале. Расширенные настройки утилиты screen описаны в статье: Использование Screen оконного менеджера для терминала.
apt install screen
Запустите новое окно командой screen и вводите команду стандартную команду запуска скрипта.
screen python3 pythonbot.py &
Нажмите сочетание клавиш Ctrl + A + D — свернуть сессию. Screen будет отсоединен от экрана, вы вернетесь в физическую консоль. Сам screen при этом никуда не девается и висит в фоне, продолжая выполнять ваши задачи.
Рассмотрим запуск приложения в роли службы. Systemd — это менеджер системы и служб Linux. Он управляет службами, которые описаны в конфигурационных файлах, и запускает их.
Создаем службу:
sudo nano /etc/systemd/system/new-application.service
Внутри этого файла вставляем:
Description=New Application After=network.target [Service] User=myuser Group=www-data WorkingDirectory=/home/myuser/new-application #Environment=VIRTUAL_ENV=/home/myuser/.virtualenvs/vlad #Environment=PYTHONPATH=/home/myuser/SM_8ject/SM-8 Environment="PATH=/home/myuser/new-application/venv/bin" ExecStart=/home/myuser/new-application/venv/bin/python bot.py --start ExecStop=/home/myuser/new-application/venv/bin/python bot.py --stop ExecReload=/home/myuser/new-application/venv/bin/python bot.py --restart TimeoutSec=30 Restart=always
Команды для запуска, остановки, перезагрузки службы
sudo systemctl start new-application sudo systemctl stop new-application sudo systemctl start new-application sudo systemctl reload new-application
Узнать статус работы:
sudo systemctl status new-application
Этот вариант предлагает использовать менеджер процессов PM2, специализированный инструмент для управления процессами Node.js, но также подходящий для запуска и мониторинга других типов процессов.
PM2 автоматически перезапускает бота и сохраняет логи. Установка PM2 описана в статье Установка, использование PM2 менеджера процессов для приложений Node.js. В самом простом случае для установки PM2 введите команды:
sudo apt install nodejs sudo apt install npm
Теперь глобально устанавливаем сам диспетчер процессов:
npm install pm2 -g
Для запуска бота перейдите в директорию с ботом и запустите его командой:
pm2 start pythonbot.py --interpreter=python3
Всё, проверьте список запущенных приложений:
pm2 list
Как запустить сайт с помощью Gunicorn: Django, Flask. Рано или поздно вы приходите к тому, что надо запустить проект на сервере. Это руководство покажет как превратить любой Python-скрипт в сайт. Также будут примеры запуска проектов, сделанных на Django и Flask.
При разработке на Python в Linux для запуска скриптов в фоновом режиме доступны четыре основных варианта: использование nohup, программы screen, Systemd или менеджера процессов PM2. Каждый из них имеет свои особенности и преимущества, и выбор зависит от конкретных требований проекта и предпочтений разработчика.
Читайте также: Как Использовать Telegram API с Bash: Отправка Сообщений, Файлов, Фотографий.