Описание проблемы: Через консоль запускаем python-скрипт, но как только отключаемся от сервера — скрипт перестаёт работать. Пробовали запустить с помощью screen (модуль, который создаёт параллельные рабочие столы), однако в случае падения скрипта модуль не перезапускается автоматически.
Решение: Использовать модуль systemd.
Как запустить Python-скрипт на постоянку при помощи systemd
Установим на сервере данный модуль:
apt-get install systemd
На компьютере создадим файл с расширением .service. В моём случае я создаю файл для запуска скрипта Телеграмм-бота, потому называю файл icopydoc-bot.service и наполняю его следующим образом:
[Unit] Description=Telegram bot ‘iCopyDoc Bot’ After=syslog.target After=network.target [Service] Type=simple User=root WorkingDirectory=/var/www/html/bot ExecStart=/usr/bin/python3 /var/www/html/bot/index.py RestartSec=10 Restart=always [Install] WantedBy=multi-user.target
Обратите внимание на правила WorkingDirectory и ExecStart. В первом мы указываем путь до папки, в которой лежат файлы проекта с ботом, а во втором прописываем путь до основного файла нашего проекта.
Шуточное приложение с убегающей кнопкой «Да» на python (питон) tkinter
Теперь нам надо закачать данный файл в /etc/systemd/system. Я делал это через FTP (подробнее о настройке FTP на Апаче).
Но вы можете воспользоваться консолью, заменив мои данные на ваши:
Далее выполняем следующие команды в консоли:
systemctl daemon-reload systemctl enable icopydoc-bot systemctl start icopydoc-bot systemctl status icopydoc-bot
Готово! Теперь скрипт будет работать в фоновом режиме даже если вы отключитесь от сервера.
Источник: icopydoc.ru
Как запустить программу на Python в фоновом режиме?
Пишу программу, позволяющую засунуть скрин экрана из буфера обмена в папку (в любую). Но не знаю как сделать так чтобы она работала на постоянке в фоновом режиме. Exe делаю в auto-py-to-exe, там же убираю консоль, так что часть с фоновым режимом пусть и криво но реализованна, а вот с постоянной работой есть проблемы. Если я делаю while True, комп немного виснет, по известным причинам, если же я его убираю, то программа проходит один раз и выключается. Как сделать так, чтобы программа работала постоянно, без while True?
Сам скрипт максимально прост и короток, подозреваю что и решение тоже.
from keyboard import is_pressed from shutil import copy from easygui import diropenbox from PIL import ImageGrab from os import getcwd while True: if is_pressed(‘Ctrl + Shift + v’): #Проверяет нажато ли сочетание клавиш folder = getcwd() #Получает директорию в которой находится скрипт im = ImageGrab.grabclipboard() #Сохраняет изображение из буфера обмена в переменную im im.save(‘somefile.png’, ‘PNG’) #Сохраняет переменную im в формате png в папке со скриптом с именем somefile.png folder2 = diropenbox() #Выводит диалоговое окно для выбора папки copy(folder + «somefile.png», folder2) #Копирует файл somefile.png в выбранную папку
Уроки Python / Запуск внешних приложений
- Вопрос задан 31 авг. 2022
- 239 просмотров
4 комментария
Простой 4 комментария
Источник: qna.habr.com
Python-сообщество
- Начало
- » Python для новичков
- » Постоянное выполнение скрипта
#1 Июнь 21, 2017 20:12:21
Постоянное выполнение скрипта
Пробую сделать включение/выключение реле на Raspberry Pi по расписанию, написав скрипт на python. Задался вопросом как сделать так, чтобы скрипт не завершался после разового выполнения. Первая мысль — зациклить в while. Сделал — получается безумная нагрузка на проц в 30-40%. Думаю может нужно ставить что-то вроде sleep(1), но это кажется каким-то костылём. Подскажите как правильно делается на python
1) Скрипт, к-й не завершается после разового выполнения (и при этом не грузит проц)
2) GUI для скрипта (попадалась информация, что цикл while будет “как-то” мешать работе GUI). Думаю попробовать PyQt или TkInter.
#!/usr/bin/env python # -*- coding: utf-8 -*- import os import sys # import logging # Подключить папку с модулями sys.path.append(os.path.dirname(__file__)+’modules’) # import GUI from Garden import * try: # Инициализации входов и запуск x = Garden() x.start() while True: x.watch() except Exception, e: raise e
#!/usr/bin/env python # -*- coding: utf-8 -*- import json import RPi.GPIO as GPIO from pprint import pprint from time import gmtime, strftime class Garden: settings_file=’settings.json’ settings = [] def __init__(self): # Считать настройки из файла settings = self.readSettings(self.settings_file) self.setSettings(settings) def __del__(self): GPIO.cleanup() def start(self): print(«Starting. «) self.initGPIO() return def initGPIO(self): # Установить нумерацию GPIO GPIO.setmode(getattr(GPIO,self.settings[‘GPIO’][‘mode’])) # Установить режимы работы каналов for t,ch in self.settings[‘GPIO’][‘channels’].items(): GPIO.setup(ch, getattr(GPIO,t) ) # print(«Initializing GPIO») return def readSettings(self,settings_file): «»»Считать настройки из файла или взять дефолтные значения»»» with open(settings_file) as file: data = json.load(file) return data def setSettings(self,settings): «»»Установить настройки»»» if not settings: return False self.settings = settings return True def setOut(self,ch,v): «»»Включить/выключить выхода»»» GPIO.output(ch, v) def getTime(self): «»»Получить текущее время»»» return strftime(«%d.%m.%Y %H:%M», gmtime()) def watch(self): «»»Сверять время»»» t = self.getTime() # Сверка времени. Хардкод if t == ‘20.06.2017 12:01’: self.setOut(11,1) print(«Включить выход») else: self.setOut(11,0) print(«Выключить выход»)
Источник: python.su