Запускаем Python-скрипт на сервере, чтобы он работал всё время
В итоге мы остановились на том, что научились запускать скрипт на сервере, чтобы он работал после разрыва соединения. Но это половинчатое решение: если мы перезапустим сервер, то бот остановится. Иногда сервер перезагружается сам на стороне провайдера, например при плановых технических работах. И тогда наши скрипты умирают.
Сейчас нам нужно такое решение, чтобы бот автоматически перезапускался при любых обстоятельствах. Этим и займёмся.
Коротко — суть
Чтобы было понятно, что тут происходит, вот короткая версия:
- Настраиваем удалённый доступ к серверу.
- Создаём папку и заливаем в неё скрипт, который в итоге должен будет работать всё время.
- Создаём у себя на компьютере файл службы — он управляет настройками автозапуска скрипта.
- Отправляем файл службы на сервер.
- Обновляем на сервере данные обо всех службах и запускаем нашу.
Теперь подробно про каждый шаг.
Предварительная работа
Основное, что мы будем использовать, — это удалённый доступ к серверу по SSH. Для этого он должен быть включён на самом сервере, и там же можно сразу посмотреть параметры доступа. Например, для работы нашего учебного сервера мы пользуемся услугами SpaceWeb, где доступ по SSH включается из панели управления:

Запускаем SSH и проверяем, что соединение устанавливается. Чтобы соединиться, нужно написать в терминале команду ssh имя_пользователя@адрес_сервера, после чего нажать Enter. Сервер спросит пароль, и, если мы его правильно ввели, нас пустят.

Мы видим приветствие сервера, значит, всё прошло хорошо и мы можем управлять им со своего компьютера. Для этого нужно будет писать в терминал команды и реагировать на то, что тебе ответит сервер.
Отправляем скрипт на сервер
Чтобы не захламлять корневую папку на сервере, создадим новую папку bot. Вот эта команда:
После этого открываем новую командную строку на компьютере, а не на сервере. Для этого нужно запустить ещё одно окно терминала. Там пишем такое:
scp /Users/mihailpolanin/Downloads/bot.py mpolyanin@77.222.61.9:bot
Вот что это означает:
- scp — копирование файла по SSH;
- /Users/mihailpolanin/Downloads/bot.py — это путь к нашему скрипту на компьютере. Его замените на то, что будет у вас;
- mpolyanin@77.222.61.9 — адрес сервера и логин пользователя. Это тоже замените на ваши данные;
- : — отделяет сервер от папки;
- bot — название папки, которую мы только что создали на сервере.
Лайфхак: чтобы не писать вручную пути до файлов на локальном компьютере, можно перед началом ввода пути просто перетащить файл в окно терминала. Терминал поймёт, что вы имели в виду «путь до этого файла», и подставит данные сам.
После запуска у нас попросят пароль от сервера — вводим его и видим статистику отправки файла:

Переключаемся обратно в SSH-соединение и проверяем, что файл скопировался и лежит в папке. Для этого вводим две команды: первая перейдёт в эту папку, а вторая покажет её содержимое:

Готовим файл для работы службы
Нам нужно, чтобы система сама следила за тем, чтобы скрипт работал всё время и запускался после перезагрузки. В Linux за это отвечают службы — одну из таких служб мы сейчас и сделаем.
Создаём на компьютере новый файл bot.service и вставляем туда такое:
[Unit] Description=tg-bot After=multi-user.target [Service] User=root Group=root Type=simple Restart=always ExecStart=/usr/bin/python3 /bot/bot.py [Install] WantedBy=multi-user.target
Два самых важных параметра — это путь к нашему скрипту (/bot/bot.py) и название службы: tg-bot. Название может быть любым, а вот путь к скрипту нужно указать точно.
Теперь закидываем этот файл на сервер в папку /usr/lib/systemd/system. Для этого в командной строке компьютера пишем:
scp /Users/mihailpolanin/Downloads/bot.service mpolyanin@77.222.61.9:/usr/lib/systemd/system
Как и раньше, не забудьте заменить адрес до файла .service на вашем компьютере, а также имя пользователя и адрес сервера. Первый адрес можно не писать вручную, а перетащить файл в терминал сразу после набора команды scp.
Запуск службы
Теперь нам нужно перезагрузить все службы, чтобы наш файл тоже попал в общий список для запуска. Открываем SSH-консоль и выполняем там такую команду:
sudo systemctl daemon-reload
И сразу включим наш сервис, чтобы он не отключался при перезагрузке сервера:
sudo systemctl enable bot.service
Всё, можно запускать наш телеграм-бот как службу. Вот основные команды для этого:
- sudo systemctl start bot.service — запустить службу;
- sudo systemctl stop bot.service — остановить службу;
- sudo systemctl status bot.service — посмотреть статус, работает или нет.
Что дальше
В следующий раз сделаем ещё круче — настроим систему мониторинга на сервере, чтобы нам на почту приходило сообщение, когда служба перезапускается или останавливается с ошибкой. Подпишитесь, чтобы не пропустить.
Любишь Python? Зарабатывай на нём!
Изучите самый модный язык программирования и станьте крутым бэкенд-разработчиком. Старт — бесплатно.

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Постоянная работа приложения Python
Добрый день. Я сам недавно занимаюсь программированием и нахожусь только на начальной стадии. И ко мне время от времени приходят вопросы ответы на которые хотелось бы узнать, но кроме как к вам, мне некуда обратиться. Подскажите пожалуйста, как заставить приложение работать постоянно? Предыстория: у меня есть приложение которое следит за обновлениями в группе в контакте, как только появляется новая запись — она загружается в БД. Я запускаю приложение, оно пробегается по последним 10 записям и загружает те которых нет в базе и так каждый раз. Как мне сделать, что бы приложение работало постоянно и при добавлении записи в группе сразу подтягивалось в БД.
Отслеживать
Владимир В.
задан 17 янв 2017 в 8:12
Владимир В. Владимир В.
461 1 1 золотой знак 8 8 серебряных знаков 23 23 бронзовых знака
в сторону: вопросы на Stack Overflow обязаны допускать возможность краткого (несколько параграфов) ответа, то есть если хороший ответ на ваш вопрос требует гораздо большего объёма, то вопрос следует сузить или вам нужен другой ресурс. Ответы, состоящие только из ссылки на внешний ресурс (книгу, статьи) не слишком полезны: многие ссылки перестают работать спустя какое-то время и лучше если веб-поисковик в таких случаях напрямую будет людей, а не через Stack Overflow (то есть вопросы, на которые можно только ссылкой ответить, лучше удалить, чтобы гугл не смущать).
17 янв 2017 в 8:25
связанныевопросы Как избежать вылета программы, Как выполнять код каждый день в заданное время
Переносимый python скрипт. Как сделать?
Есть скрипт для копирования фото. В нем используются такие модули:
import argparse import os import re import shutil import sys from PIL import Image from PIL.ExifTags import TAGS
Нужно чтоб этот скрипт работал на любой убунте, и на тех где не установлен python-pil.
Почитала про distutils, не подходит, т.к. он для модулей, а у меня обычный скрипт

Jills ★
11.05.15 13:38:25 MSK
jori ★
( 11.05.15 13:42:41 MSK )

Посмотри в сторону pip. Оно умеет ставить зависимости.
Что касается distutils то, по-моему, для скриптов оно вполне годилось. Но умеет ли оно, например, работать с репозиториями и выкачивать зависимости я не помню не знаю.
true_admin ★★★★★
( 11.05.15 13:43:34 MSK )

Тебе для себя или для публикации? Если для публикации то не нужно городить велосипед, приведённой копипасты с импортами достаточно что-бы дать понять что нужно установить соответствующие модули (для полного феньшуя можно ещё в сопроводительном тексте или в комментариях в самом скрипте перечислить необходимые модули).
MrClon ★★★★★
( 11.05.15 13:43:45 MSK )

Если тебе нужна какая-то библиотека, то носи её с собой или устанавливай. Третьего здесь нет.
spichka ★★★
( 11.05.15 13:44:42 MSK )

Самый простой вариант после didstutils — воспользоваться virtualenv. А именно:
1. Делаешь виртуалэнв
2. Устанавливаешь все зависимости
4. Делаешь скрипт запуска, который использует интерпретатор virtualenv вместо системного
3. делаешь pip freeze > requirements.txt и кидаешь его рядом со скриптом.
4. На новую дистру перекидываешь либо весь проект вместе с виртуалэнв, либо заного создаешь виртуалэнв и выполняешь pip install -r requirements.txt
Siado ★★★★★
( 11.05.15 13:45:45 MSK )
Ответ на: комментарий от Siado 11.05.15 13:45:45 MSK

Впрочем можно то же самое и без vitrualenv, но придется от рута запускать установку
Siado ★★★★★
( 11.05.15 13:46:27 MSK )
Последнее исправление: Siado 11.05.15 13:46:34 MSK (всего исправлений: 1)
Ответ на: комментарий от Siado 11.05.15 13:46:27 MSK

Удваиваю virtualenv + pip. Мне не нравится что pip работает в обход пакетного менеджера. Это чревато.
true_admin ★★★★★
( 11.05.15 13:49:30 MSK )

Мне одному кажется что все эти пляски, с виртуальными окружениями и прочим, излишни для скрипта? По крайней мере если все нужные модули есть в репах бубунтодебиана.
MrClon ★★★★★
( 11.05.15 13:52:20 MSK )
Ответ на: комментарий от MrClon 11.05.15 13:52:20 MSK

все эти пляски, с виртуальными окружениями и прочим, излишни для скрипта
Jills ★
( 11.05.15 13:53:30 MSK ) автор топика
Ответ на: комментарий от MrClon 11.05.15 13:52:20 MSK

Действительно, мб лучше собрать пакет, и указать все зависимости?
neversleep ★★
( 11.05.15 13:55:19 MSK )

таскать за собой pil ?
ggrn ★★★★★
( 11.05.15 14:04:00 MSK )
Ответ на: комментарий от neversleep 11.05.15 13:55:19 MSK

Опокечивать скрипт? Может у нас разные представления о том что такое скрипт, но в моём понимании скрипт что какая-то подсобная мелочёвка на десяток другой строк кода. Ради этого разводить возню с пакетированием не стоит.
Вообще блока импортов волне достаточно что-бы понять что нужно установить такие-то модули (любым удобным пользователю способом). Можно ещё до кучи в коментах написать то-же самое человеческим языком. В крайней случае можно даже привести готовую команду вида sudo apt-get install список пакетов (не-убунтоиды по идее и без этого разберутся).
MrClon ★★★★★
( 11.05.15 14:13:00 MSK )
Ответ на: комментарий от MrClon 11.05.15 14:13:00 MSK

Я понимаю, что это как из пушки по воробьям, но зато очень удобно. Так же неизвестно, кто будет конечным пользователем, а если это делается один раз, то почему бы и нет?
neversleep ★★
( 11.05.15 14:30:07 MSK )
Ответ на: комментарий от MrClon 11.05.15 14:13:00 MSK

wget script.sh | sudo sh единственный православный способ установки пдобного.
entefeed ☆☆☆
( 11.05.15 14:32:57 MSK )
Видел, что уже посоветовали таскать за собой virtualenv. Как по мне, можно сделать проще:
$ wget downloads.buildout.org/2/bootstrap.py
Создаёшь setup.py на подобии этого (если ещё не создан):
from setuptools import setup, find_packages setup( name='имя_пакета_заменяешь_на_своё', version='0.0.1', packages=find_packages('src'), package_dir=, install_requires=[ 'Pillow' ], entry_points= < 'console_scripts': [ 'run=имя_пакета:имя_функции' ] >)
Создаёшь директорию src/имя_пакета . Туда ложишь свой скрипт и __init__.py .
В __init__.py определяешь функцию, которая будет выполнять роль точки входа. Её имя должно быть указано в setup.py
Можно сразу весь код в __init__.py положить, тут уже как удобнее будет.
[buildout] develop = . parts = main show-picked-versions = true versions=versions [main] recipe = zc.recipe.egg eggs = имя_пакета interpreter = py [versions] Pillow = нужная.версия
Выполняешь python bootstrap.py и bin/buildout . Эти две команды установят setuptools и зависимости, описанные в setup.py , в директорию ./eggs .
Для запуска скрипта нужно будет выполнить bin/run . А для запуска интерпретатора — bin/py .
Если используется третий питон, то вместо python bootstrap.py надо будет выполнить python3 bootstrap.py Теперь можно собрать архив и закинуть на любой ПК.
Почитать про buildout можно тут: http://buildout.org/ Ну найти а доку по setuptools, думаю, не составит труда.
Kilte ★★★★★
( 11.05.15 14:50:47 MSK )
Ответ на: комментарий от true_admin 11.05.15 13:49:30 MSK

Но ведь у них там своя песочница получается, в которой можно что угодно творить. Чем это может быть чревато?
shooter93 ★★
( 11.05.15 15:06:13 MSK )
Ответ на: комментарий от shooter93 11.05.15 15:06:13 MSK

Ммм, а как это песночница работает? Ты имеешь в виду настроить pip чтобы он под локальным префиксом ставил? Ну так это надо настраивать, для конечного юзера это гемор. Тут уж проще с virtualenv замутить.
Если же просто сделать pip install то оно положит, например, в /usr/lib/python3.4/site-packages/ .
true_admin ★★★★★
( 11.05.15 15:12:40 MSK )

А зачем? Просто указать зависимости, юзер сам поставит. А если будут включать скрипт в репозитарий, то зависимости разрулит пакетный менеджер. Не стоит тут велосипеды городить, имхо.
А если юзер не читает документацию, не знает какие у скрипта зависимости и вообще непонятно, где его взял, то ему можно об этом сообщить как нибудь:
try: from PIL import Image from PIL.ExifTags import TAGS except: print("This script requires 'python-pil' package installed") sys.exit(1)
А таскать всё с собой — это windows-way какой-то.
Psych218 ★★★★★
( 11.05.15 15:34:35 MSK )
Последнее исправление: Psych218 11.05.15 15:35:39 MSK (всего исправлений: 1)
Ответ на: комментарий от true_admin 11.05.15 15:12:40 MSK

В дебобунтах он по умолчанию в /usr/local/ библиотеки ложит.
templarrr ★★★★★
( 11.05.15 15:56:21 MSK )
Ответ на: комментарий от templarrr 11.05.15 15:56:21 MSK

Понял. Но тогда, если модуль слишком тухлый в дистрибутиве, то pip поставит свежую версию которая не подхватится, верно? Хотя, не удивлюсь если уже придумали какой-нить более продвинутый импортёр модулей который понимает несколько установленных модулей и выбирает нужный. Есть что-то типа такого?
module = require(modname, version)
По-моему, где-то даже видел что этот require ещё и сам поставит пакет если его нет в системе. А может с javascript путаю.
Вот мой sys.path на старой виртуалке:
# cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=12.04 DISTRIB_CODENAME=precise DISTRIB_DESCRIPTION="Ubuntu 12.04.5 LTS" # python -c 'import sys; print(sys.path)' ['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/gtk-2.0']
true_admin ★★★★★
( 11.05.15 16:10:24 MSK )
Ответ на: комментарий от Psych218 11.05.15 15:34:35 MSK

Короче, из самого же скрипта можно настроить virtenv и поставить пакеты в него через pip если их нет. Последующие запуски уже этого не потребуют.
true_admin ★★★★★
( 11.05.15 16:21:18 MSK )
Ответ на: комментарий от Psych218 11.05.15 15:34:35 MSK
Удваиваю этого регистранта. Опачечивания и virtualenv — слишком избыточно для обычного скрипта.
NeverLoved ★★★★★
( 11.05.15 16:31:06 MSK )

докер конечно же 🙂
umren ★★★★★
( 11.05.15 16:43:27 MSK )

Нужно чтоб этот скрипт работал на любой убунте
«Теперь это так называется»
hobbit ★★★★★
( 11.05.15 16:47:43 MSK )
Есть занятный способ: покидать зависимости в одну папку, зазиповать, и получить исполняемый python-скрипт «все включено».
Но вот у конкретно этой графической библиотеки есть обязательные сишные расширения, так что способ не подходит.
Поэтому лучше все-таки закинуть скрипт в пакет, или в инструкцию добавить: «Напишите sudo apt-get install python-pil». Если взять virtualenv, то получится замена шила на мыло: ему обязательно потребуется сишный компилятор, который все равно придется поставить apt-get’ом.
anonymous
( 11.05.15 17:06:40 MSK )
Ответ на: комментарий от Psych218 11.05.15 15:34:35 MSK

Две кружки медовухи ему! Нафига разводить все эти лишние сложности?
Только навороты над импортами это вроде не по PEP8. Да import и сам ругаться хорошо умеет, без костылей.
MrClon ★★★★★
( 11.05.15 17:36:47 MSK )
Ответ на: комментарий от umren 11.05.15 16:43:27 MSK

Всё ждал когда это предложат.
MrClon ★★★★★
( 11.05.15 17:37:52 MSK )
Ответ на: комментарий от MrClon 11.05.15 14:13:00 MSK
└► file /usr/bin/* | grep -ie script | wc -l 593
Каждый из этих 593 скриптов опакечен.
скрипт что какая-то подсобная мелочёвка на десяток другой строк кода
К данному случаю это не относится — слишком много зависимостей.
Хотя сама по себе сборка deb-пакетов — развлекуха та еще.
dexpl ★★★★★
( 11.05.15 19:37:52 MSK )
Ответ на: комментарий от dexpl 11.05.15 19:37:52 MSK

Утилита file показывает тип файла. В эти 593 скорее всего попало вообще всё что не является бинарным файлом или java-приложением.
Перепиши GIMP на python, и он тоже попадёт в список скриптов.
К тому-же многие из этих 593 файлов входят в большие пакеты в которых более одного исполняемого файла.
К данному случаю это не относится — слишком много зависимостей.
Да, целая одна зависимость которой возможно ещё нет в системе. Все эти os и sys всегда уже есть в системе, а если учесть что речь идёт про бубунты (в которых из коробки не мало питонячего софта) скорее всего в свежеустановленной системе не будет только PIL.
MrClon ★★★★★
( 11.05.15 20:05:14 MSK )
Ответ на: комментарий от MrClon 11.05.15 20:05:14 MSK
Утилита file показывает тип файла. В эти 593 скорее всего попало вообще всё что не является бинарным файлом или java-приложением.
Даже одни только abcde, akmods и youtube-dl — уже достаточная иллюстрация того, что в пакетировании скриптов нет ничего сверхъестественного.
Да, целая одна зависимость которой возможно ещё нет в системе.
Умножь на десяток-другой хостов.
Впрочем, можно и ограничиться инструкцией вида sudo apt-get install python-pil .
dexpl ★★★★★
( 11.05.15 20:49:00 MSK )
Ответ на: комментарий от dexpl 11.05.15 20:49:00 MSK

Пакетировать всякую мелочёвку есть смысл что-бы пропихнуть её в репозитории. В других случаях я не вижу в этом смысла.
MrClon ★★★★★
( 11.05.15 20:58:17 MSK )
Ответ на: комментарий от entefeed 11.05.15 14:32:57 MSK

Опять яблочники с райскими условиями для однострочников на перле повылезали.
thriller ★★
( 11.05.15 21:03:15 MSK )
Ответ на: комментарий от dexpl 11.05.15 20:49:00 MSK

Даже одни только abcde, akmods и youtube-dl — уже достаточная иллюстрация того, что в пакетировании скриптов нет ничего сверхъестественного.
Только youtube-dl, к примеру, — это не одинокий скрипт, это ещё и мешок модулей под все сайты подряд. А у некоторых ещё и /usr/bin/ часто оказываются странными скриптами запуска того, что в /usr/lib/… лежит. И ldd не одинок, а идёт с glibc. И так далее. В реальности примеров пакетов с одинокими скриптами буквально кот накакал.
thriller ★★
( 11.05.15 21:13:44 MSK )
Ответ на: комментарий от thriller 11.05.15 21:13:44 MSK
Только youtube-dl, к примеру, — это не одинокий скрипт, это ещё и мешок модулей под все сайты подряд
Помню времена, когда он был одиночным скриптом.
В реальности примеров пакетов с одинокими скриптами буквально кот накакал.
Даже если бы такой скрипт в природе был бы всего один, он уже служил бы подтверждением того, что в пакетировании скриптов ничего противоестественного нет.
dexpl ★★★★★
( 11.05.15 21:28:36 MSK )
Ответ на: комментарий от MrClon 11.05.15 20:58:17 MSK
Пакетировать всякую мелочёвку есть смысл что-бы пропихнуть её в репозитории.
Создание собственного PPA — следующий шаг. Имеет смысл в случаях, когда у тебя есть заметное количество никому кроме тебя не нужной мелочевки и несколько хостов, на каждом из которых тебе нужна эта мелочевка.
dexpl ★★★★★
( 11.05.15 21:30:37 MSK )
Ответ на: комментарий от dexpl 11.05.15 21:30:37 MSK

Этож сколько надо скриптов, этож сколько надо хостов что-бы всё это было оправдано.
Так и до докера докатиться можно.
MrClon ★★★★★
( 11.05.15 22:11:11 MSK )
Ответ на: комментарий от thriller 11.05.15 21:03:15 MSK

А ты толстолобый.
entefeed ☆☆☆
( 11.05.15 22:57:01 MSK )

try: from PIL import Image except ImportError: from subprocess import check_call check_call('sudo apt-get install -y python-pil', shell=True) from PIL import Image
ei-grad ★★★★★
( 11.05.15 23:04:58 MSK )
Последнее исправление: ei-grad 11.05.15 23:06:08 MSK (всего исправлений: 1)

А вообще просто собери скрипт в .deb-пакет, подними свою репку (даже не обязательно PPA) и ставь оттуда.
ei-grad ★★★★★
( 11.05.15 23:14:54 MSK )
Ответ на: комментарий от hobbit 11.05.15 16:47:43 MSK

А в чём проблема?
frob ★★★★★
( 12.05.15 02:37:04 MSK )
Ответ на: комментарий от umren 11.05.15 16:43:27 MSK

2 чаю этому господину
ggrn ★★★★★
( 12.05.15 08:20:13 MSK )

годная тема, сам боялся спросить. Я лично использую setuptools 🙂
amazpyel ★★★
( 12.05.15 17:48:54 MSK )
Ответ на: комментарий от Siado 11.05.15 13:45:45 MSK

4. Делаешь скрипт запуска, который использует интерпретатор virtualenv вместо системного
Можно ли просто создать requirements.txt с нужными модулями и носить в папке со скриптом, чтоб потом установить зависимости через pip?
Jills ★
( 14.05.15 22:26:34 MSK ) автор топика
Ответ на: комментарий от Jills 14.05.15 22:26:34 MSK

Можно ли просто создать requirements.txt с нужными модулями и носить в папке со скриптом, чтоб потом установить зависимости через pip?
Siado ★★★★★
( 14.05.15 22:28:07 MSK )
Ответ на: комментарий от true_admin 11.05.15 13:49:30 MSK

Jills ★
( 15.05.15 09:43:13 MSK ) автор топика
Ответ на: комментарий от Jills 15.05.15 09:43:13 MSK

Конфликтами. Возможно несколько исходов в зависимости от того что куда проинсталлилось. Например, ты поставил более новую версию пакета руками для своего скрипта. А пакетный менеджер об этом не знает и может поставить этот пакет другой версии ещё раз. Результат зависит от того какой пакет найдётся первым и на сколько старая и новая версия совместимы.
true_admin ★★★★★
( 15.05.15 11:56:14 MSK )

добавить в скрипт установку этих модулей.
erzent ☆☆
( 15.05.15 11:57:49 MSK )
Ответ на: комментарий от true_admin 15.05.15 11:56:14 MSK

ты поставил более новую версию пакета руками для своего скрипта
А разве прекрасный/глобальный/надежный не умеет сразу несколько версий модуля? 🙁
А пакетный менеджер об этом не знает и может поставить этот пакет другой версии ещё раз.
А зачем тогда нужны пакетные менеджеры ЯП? Только для «песочниц»?
outtaspace ★★★
( 15.05.15 12:56:18 MSK )
Ответ на: комментарий от outtaspace 15.05.15 12:56:18 MSK

А разве прекрасный/глобальный/надежный не умеет сразу несколько версий модуля? 🙁
А какие вообще умеют? Ну, кроме гентушного. И, по-моему, там одновременно только одна версия активна, не? И вообще, хотелось бы это иметь в самом ЯП из коробки. Чтобы в скрипте можно было прописать, скажем, минимально необходимые версии и чтобы ЯП сам понимал несколько установленных версий. На данный момент всё больше людей это понимают и когда-нить в питоне будет продвинутый import. Собстно, уже сейчас можно такое сделать руками с importlib, но хотелось бы стандартное решение.
А зачем тогда нужны пакетные менеджеры ЯП? Только для «песочниц»?
Тут желательно определиться чем пользоваться: средствами ЯП или же средствами пакетного менеджера. У каждого метода свои плюсы и минусы. Лично я использую сразу оба, доставляя руками только то чего нет в пакетах. Я раньше использовал всякие checkinstall чтобы пакеты создавались автоматически, но щас забил.
Для сложных проектов с кучей зависимостей я рекомендую virtualenv. Ну просто потому что велики шансы что нужных версий в дистрибутиве не окажется и дабы не создвать слакварьпомойку.
true_admin ★★★★★
( 15.05.15 13:42:34 MSK )
Ответ на: комментарий от true_admin 15.05.15 13:42:34 MSK

А какие вообще умеют?
И вообще, хотелось бы это иметь в самом ЯП из коробки
Из тех что знаю, только Perl6 умеет. Сильно разочаровался в питоне, когда узнал что он такой отсталый.
Тут желательно определиться чем пользоваться
Это понятно. Видимо стоит брать песочницу, в которой только батарейка ЯП, ну и пользоваться всякими virtualenv.
Как сделать чтобы скрипт(сервер) работал после закрытия SSH?
Я написал мессенджер на питоне, поставил сервер.py на VPS, всё работает, но как сделать чтобы сервер работал на постоянной основе? Тк когда я закрываю SSH, соединение закрывается и сервер падает.
- Вопрос задан более трёх лет назад
- 1032 просмотра
Комментировать
Решения вопроса 2

& &! nohup
и тп — не являются решением вашей проблемы
Ответ написан более трёх лет назад
Нравится 1 2 комментария
Kibernet @kibernetshow Автор вопроса
А где именно указать путь к самому файлу сервер.py?
[root@y500-fedora ~]# cat /etc/systemd/system/foo.service [Unit] Description=foo [Service] ExecStart=/bin/bash -c "while true; do /bin/inotifywait -qq --event close_write /sys/class/backlight/acpi_video0/brightness; su myusername -c '/bin/xbacklight -display :0 -set $(cat /sys/class/backlight/acpi_video0/brightness)'; done" [Install] WantedBy=multi-user.target