Python есть на большинстве Linux-серверов по умолчанию. Но между «запустить скрипт вручную один раз» и «запустить правильно в нужном окружении с нужными зависимостями» — заметная разница. Разберём все варианты по порядку.
Проверить, установлен ли Python
Прежде чем запускать — стоит убедиться, что интерпретатор есть:
python3 --version
На современных дистрибутивах Python 3 доступен как python3. Команда python без цифры может указывать на Python 2 (уже не поддерживается) или отсутствовать вообще.
which python3
Покажет путь к исполняемому файлу — /usr/bin/python3 на большинстве систем.
Если Python не установлен:
sudo apt install python3 # Debian/Ubuntu
sudo dnf install python3 # Fedora/RHEL
sudo pacman -S python # Arch Linux
Способ 1: передать скрипт интерпретатору
Самый прямолинейный вариант:
python3 myscript.py
Можно указать полный путь к скрипту:
python3 /home/user/scripts/myscript.py
Или перейти в директорию и запустить:
cd /home/user/scripts
python3 myscript.py
Передать аргументы скрипту — просто добавить их после имени файла:
python3 myscript.py arg1 arg2
Внутри скрипта они доступны через sys.argv:
import sys
print(sys.argv) # ['myscript.py', 'arg1', 'arg2']
Способ 2: shebang — запуск без python3 в начале
Шебанг (#!) — первая строка скрипта, которая указывает системе, каким интерпретатором запускать файл. После этого скрипт можно вызывать напрямую, без явного указания python3.
Добавить в первую строку скрипта:
#!/usr/bin/env python3
/usr/bin/env python3 предпочтительнее, чем жёсткий путь /usr/bin/python3 — env сам найдёт интерпретатор в переменной PATH, что делает скрипт переносимым между системами.
После этого сделать файл исполняемым:
chmod +x myscript.py
Теперь запускать можно так:
./myscript.py
Или по абсолютному пути:
/home/user/scripts/myscript.py
Способ 3: запуск из любого места через PATH
Если скрипт нужен глобально — как системная команда — его кладут в директорию из переменной PATH:
sudo cp myscript.py /usr/local/bin/myscript
sudo chmod +x /usr/local/bin/myscript
Расширение .py убрано — так команда выглядит чище. Shebang внутри скрипта обязателен. После этого скрипт запускается просто:
myscript
Проверить, что директория в PATH:
echo $PATH
/usr/local/bin есть там по умолчанию на большинстве систем.
Виртуальные окружения: запуск с изолированными зависимостями
На реальных серверах скрипты редко работают без зависимостей. Устанавливать пакеты глобально через pip — плохая практика: разные проекты могут требовать несовместимые версии. Для этого существуют виртуальные окружения.
Создать окружение:
python3 -m venv /opt/myapp/venv
Активировать:
source /opt/myapp/venv/bin/activate
После активации python и pip указывают на версии внутри окружения:
pip install requests pandas
python myscript.py
Деактивировать:
deactivate
Запуск без активации окружения
Для скриптов, cron-задач и systemd-сервисов удобнее вызывать интерпретатор напрямую из окружения — без активации:
/opt/myapp/venv/bin/python3 myscript.py
Этот способ надёжнее в автоматизации, потому что не зависит от активации в текущей сессии.
Интерактивный режим
Флаг -i запускает скрипт и после его выполнения оставляет открытым Python REPL. Удобно для отладки — можно посмотреть значения переменных после завершения:
python3 -i myscript.py
После выполнения скрипта появится приглашение >>>, в котором доступны все переменные из скрипта.
Запуск в фоне
Чтобы скрипт продолжал работать после закрытия терминала:
nohup python3 myscript.py &
nohup защищает процесс от сигнала HUP при закрытии сессии. & отправляет в фон. Вывод по умолчанию пишется в файл nohup.out.
С перенаправлением вывода в конкретный лог:
nohup python3 myscript.py >> /var/log/myscript.log 2>&1 &
Узнать PID запущенного скрипта:
pgrep -f myscript.py
Остановить:
pkill -f myscript.py
Автозапуск через cron
Для скриптов, которые нужно запускать по расписанию:
crontab -e
Примеры записей:
# Каждые 5 минут
*/5 * * * * /opt/myapp/venv/bin/python3 /opt/myapp/myscript.py
# Каждый день в 03:00
0 3 * * * /opt/myapp/venv/bin/python3 /opt/myapp/backup.py >> /var/log/backup.log 2>&1
# Каждое воскресенье в 01:00
0 1 * * 0 /usr/bin/python3 /opt/scripts/cleanup.py
В cron нет окружения пользователя — PATH и переменные не те, что в обычной сессии. Поэтому всегда указывать полный путь к интерпретатору и к скрипту.
Автозапуск через systemd (как сервис)
Для долгоживущих скриптов или демонов systemd — более правильный инструмент, чем nohup.
Создать unit-файл:
sudo nano /etc/systemd/system/myscript.service
Содержимое:
[Unit]
Description=My Python Script
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/venv/bin/python3 /opt/myapp/myscript.py
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
Активировать и запустить:
sudo systemctl daemon-reload
sudo systemctl enable myscript.service
sudo systemctl start myscript.service
Посмотреть статус и логи:
sudo systemctl status myscript.service
sudo journalctl -u myscript.service -f
Частые ошибки при запуске
python3: command not found Python не установлен или не добавлен в PATH. Установить через пакетный менеджер.
ModuleNotFoundError: No module named 'requests' Модуль не установлен в том окружении, которым запускается скрипт. Установить через pip install requests в нужном окружении — или убедиться, что используется интерпретатор из правильного venv.
Permission denied Скрипт не имеет права на выполнение. Добавить: chmod +x myscript.py. Или запускать явно через python3 myscript.py — тогда права на исполнение самого файла не нужны.
SyntaxError при запуске через python вместо python3 Скрипт написан для Python 3, а запускается Python 2. Всегда использовать python3.
Скрипт запускается, но ничего не делает в cron Скорее всего, проблема с PATH или рабочей директорией. Добавить в начало crontab: SHELL=/bin/bash и PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin. Или указывать все пути абсолютно.
Шпаргалка
| Задача | Команда |
|---|---|
| Запустить скрипт | python3 script.py |
| Запустить с аргументами | python3 script.py arg1 arg2 |
| Сделать исполняемым | chmod +x script.py + shebang #!/usr/bin/env python3 |
| Запустить исполняемый | ./script.py |
| Запустить в фоне | nohup python3 script.py >> app.log 2>&1 & |
| Запустить в venv | /path/to/venv/bin/python3 script.py |
| Интерактивный режим после выполнения | python3 -i script.py |
| Посмотреть PID | pgrep -f script.py |
| Остановить | pkill -f script.py |
Итог
Для разовых задач — python3 script.py. Для скриптов с зависимостями — виртуальное окружение и вызов через полный путь к интерпретатору. Для автоматизации по расписанию — cron с абсолютными путями. Для постоянно работающих процессов — systemd-сервис.
Всё это работает на любом VPS с Linux. Подобрать сервер под Python-проект можно в каталоге PQ.Hosting.