Модули , используемые в данном примере , являются частью pywin32 (Python для расширений Windows). В зависимости от того, как вы установили Python, вам может потребоваться установить его отдельно.
import win32serviceutil import win32service import win32event import servicemanager import socket class AppServerSvc (win32serviceutil.ServiceFramework): _svc_name_ = «TestService» _svc_display_name_ = «Test Service» def __init__(self,args): win32serviceutil.ServiceFramework.__init__(self,args) self.hWaitStop = win32event.CreateEvent(None,0,0,None) socket.setdefaulttimeout(60) def SvcStop(self): self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) win32event.SetEvent(self.hWaitStop) def SvcDoRun(self): servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE, servicemanager.PYS_SERVICE_STARTED, (self._svc_name_,»)) self.main() def main(self): pass if __name__ == ‘__main__’: win32serviceutil.HandleCommandLine(AppServerSvc)
Это просто шаблон. Код вашего приложения, вероятно, вызывающий отдельный скрипт, будет идти в функцию main ().
Сделал Python программу для отслеживания курса валют
Вам также нужно будет установить это как сервис. Лучшее решение для этого в данный момент , как представляется, использовать Non-сосущий Service Manager.Это позволяет установить службу и предоставляет графический интерфейс для настройки командной строки, которую выполняет служба. Для Python вы можете сделать это, что создает сервис за один раз:
nssm install MyServiceName c:python27python.exe c:tempmyscript.py
Где my_script.py — это приведенный выше шаблон сценария, измененный для вызова сценария приложения или кода в функции main().Обратите внимание, что сервис не запускает скрипт Python напрямую, он запускает интерпретатор Python и передает ему основной скрипт в командной строке.
В качестве альтернативы вы можете использовать инструменты, предоставленные в Windows Server Resource Kit для вашей версии операционной системы, поэтому создайте службу.
Запуск веб-приложения Flask в качестве службы
Это вариант общего примера. Вам просто нужно импортировать приложение сценарий и вызвать это run() метод в сервисе main() функции. В этом случае мы также используем многопроцессорной модуль из — за проблемы с доступом WSGIRequestHandler .
import win32serviceutil import win32service import win32event import servicemanager from multiprocessing import Process from app import app class Service(win32serviceutil.ServiceFramework): _svc_name_ = «TestService» _svc_display_name_ = «Test Service» _svc_description_ = «Tests Python service framework by receiving and echoing messages over a named pipe» def __init__(self, *args): super().__init__(*args) def SvcStop(self): self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) self.process.terminate() self.ReportServiceStatus(win32service.SERVICE_STOPPED) def SvcDoRun(self): self.process = Process(target=self.main) self.process.start() self.process.run() def main(self): app.run() if __name__ == ‘__main__’: win32serviceutil.HandleCommandLine(Service)
Источник: www.codecamp.ru
Как запустить Python IDLE и сделать первую программу (для новичков)
Русские Блоги
Если мы написали файл script1.py в папке D: python, нам нужно запустить этот файл, чтобы сделать это:
# A first Python script import sys print(sys.platform) print(2 ** 100) x = ‘Spam!’ print(x * 8)
Путь первый: Сначала мы используем cmd для запуска этого файла, откройте cmd, Введите полное имя пути или пространство Python напрямую, а затем перетащите файл в cmd
Microsoft Windows [версия 10.0.14393] (c) Корпорация Майкрософт, 2016 год. Все права защищены. C:Usersadmin>python D:pythonscript1.py win32 1267650600228229401496703205376 Spam!Spam!Spam!Spam!Spam!Spam!Spam!Spam!
Метод второй: сначала мы получаем путь к файлу D: python, а затем используем команду python
Microsoft Windows [версия 10.0.14393] (c) Корпорация Майкрософт, 2016 год. Все права защищены. C:Usersadmin>d: D:>cd d:python d:python>python script1.py win32 1267650600228229401496703205376 Spam!Spam!Spam!Spam!Spam!Spam!Spam!Spam!
Третий путь: Конечно, мы также можем Нажмите файл script1.py непосредственно для запуска , Но при непосредственном запуске файла будет происходить вспышка, мы можем использовать метод ввода, чтобы приостановить окно cmd, как показано ниже:
# A first Python script import sys print(sys.platform) print(2 ** 100) x = ‘Spam!’ print(x * 8) input()
Хотя вы можете напрямую запустить файл значков script1.py, вы не можете напрямую отображать сообщения об ошибках Python, такие как команда cmd.
Способ 4. Использование импорта для импорта модулей (Этот режим не может повторяться более одного раза)
Microsoft Windows [версия 10.0.14393] (c) Корпорация Майкрософт, 2016 год. Все права защищены. C:Usersadmin>d: D:>cd d:python d:python>python Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32 Type «help», «copyright», «credits» or «license» for more information. >>> import script1 win32 1267650600228229401496703205376 Spam!Spam!Spam!Spam!Spam!Spam!Spam!Spam! >>>
Метод 5: Используйте exec для запуска файла модуля
Microsoft Windows [версия 10.0.14393] (c) Корпорация Майкрософт, 2016 год. Все права защищены. C:Usersadmin>d: D:>cd d:python d:python>python Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32 Type «help», «copyright», «credits» or «license» for more information. >>> exec(open(‘script1.py’).read()) win32 1267650600228229401496703205376 Spam!Spam!Spam!Spam!Spam!Spam!Spam!Spam! >>>
Модуль импорта и перезагрузки
Каждый исходный код Python, заканчивающийся расширением py, является модулем. Другие файлы могут читать содержимое этого модуля путем импорта модуля. По сути, это загрузка другого файла и возможность чтения содержимого этого файла. ,
Используйте импорт для реализации импорта модуля, как показано ниже: мы генерируем файл myfile.py
title = «The meaning of Life»
Затем мы используем импорт для доступа к заголовку свойства
Microsoft Windows [версия 10.0.14393] (c) Корпорация Майкрософт, 2016 год. Все права защищены. C:Usersadmin>python Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32 Type «help», «copyright», «credits» or «license» for more information. >>> import myfile Traceback (most recent call last): File «», line 1, in ModuleNotFoundError: No module named ‘myfile’ >>>
В описанной выше ситуации мы можем улучшить ее, основываясь на том, как Python ищет пути к модулям:
Путь к поисковому модулю Python:
(1), основной каталог программы
(2), каталог PTYHONPATH (если он был установлен)
(3), стандартный каталог библиотеки (обычно в /usr/local/lib/python2.X/)
(4), содержимое любого файла .pth (если он существует). Новая функция, позволяющая пользователям добавлять эффективные каталоги к пути поиска модуля в текстовый файл с суффиксом .pth Список каталогов построчно. (При необходимости файл .pth также будет создан в каталоге Lib site-packages)
Комбинация этих четырех компонентов становится sys.path,
Здесь мы можем использовать второй метод, задав путь PYTHONPATH следующим образом:
Далее мы снова запускаем:
Microsoft Windows [версия 10.0.14393] (c) Корпорация Майкрософт, 2016 год. Все права защищены. C:Usersadmin>python Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32 Type «help», «copyright», «credits» or «license» for more information. >>> import myfile >>> print(myfile.title) The meaning of Life >>>
Импорт — очень дорогая операция, поэтому каждый файл и каждая программа не могут быть запущены более одного раза. Если вы хотите снова запустить файл в том же сеансе, вам нужно вызвать функцию перезагрузки, доступную в модуле стандартной библиотеки imp.
Источник: russianblogs.com
subprocess – создание и взаимодействие с процессами в Python
Стандартный модуль subprocess позволяет вызывать процессы из Python и взаимодействовать с ними: отправлять данные на вход (stdin) и получать информацию на выходе (stdout).
Также можно дождаться завершения процесса или завершить его преждевременно и получить возвращаемое значение.
Это идеальный и рекомендуемый метод для выполнения команд операционной системы или запуска программ (вместо традиционного os.system()) и опционального взаимодействия с ними.
Самый простой способ выполнить команду или вызвать процесс – это функция call() (с Python 2.4 по 3.4) или run() (3.5+).
Например, следующий код выполняет команду, которая перезагружает систему.
>>> import subprocess >>> subprocess.run([«shutdown», «-r»])Code language: CSS (css)
>>> import subprocess >>> subprocess.call([«shutdown», «-r»])Code language: CSS (css)
При вызове команды, содержащей пробелы (особенно в дистрибутивах Linux), рекомендуется передавать список вместо строки, чтобы избежать неправильной интерпретации.
>>> subprocess.run(«shutdown -r») Traceback (most recent call last): . OSError: [Errno 2] No such file or directoryCode language: CSS (css)
>>> subprocess.call(«shutdown -r») Traceback (most recent call last): . OSError: [Errno 2] No such file or directoryCode language: CSS (css)
Обе функции не возвращаются, пока вызванная программа не завершится. call() вернет возвращаемое значение выполненной команды или программы в виде целого числа. run() вернет экземпляр CompletedProcess, который содержит атрибут returncode.
>>> p = subprocess.run([«python», «—version»]) Python 3.5.1 >>> p.returncode 0Code language: JavaScript (javascript)
>>> ret = subprocess.call([«python», «—version»]) Python 2.7.13 >>> ret 0Code language: JavaScript (javascript)
(Обычно 0 означает, что программа была выполнена правильно).
Для использования команд терминала (таких как clear или cls для очистки консоли, cd для перемещения по дереву каталогов и т.д.) необходимо указать параметр shell=True.
>>> subprocess.run(«cls», shell=True)Code language: PHP (php)
>>> subprocess.call(«cls», shell=True)Code language: PHP (php)
Важно отметить, что использование shell=True является потенциальной уязвимостью, если команда выполняется пользователем (аналогично методу инъекции SQL-кода в приложениях, взаимодействующих с базами данных).
Теперь, чтобы сохранить вывод команды в виде строки Python, мы должны указать параметры stdout и stderr. Например:
>>> p = subprocess.run(«ver», stdout=subprocess.PIPE, shell=True) >>> p.stdout b’rnMicrosoft Windows [Versixa2n 6.2.9200]rn’Code language: PHP (php)
>>> p = subprocess.Popen(«ver», stdout=subprocess.PIPE, shell=True) >>> stdout = p.communicate()[0] >>> stdout ‘rnMicrosoft Windows [Versixa2n 6.2.9200]rn’Code language: PHP (php)
Команда Windows ver отправляет версию системы в stdout. Мы можем получить к нему доступ через атрибут stdout (3.5+) или метод communicate() (2.4-3.4)
Обратите внимание, что в Python 3 результат является экземпляром типа bytes, в Python 2 – типа str.
Для доступа к потенциальным ошибкам, отправленным в stderr, процесс аналогичен:
>>> p = subprocess.run([«python», «-m», «inexistente»], stderr=subprocess.PIPE) >>> p.stderr b’C:\python35\python.exe: No module named inexistentern’Code language: JavaScript (javascript)
>>> p = subprocess.Popen([«python», «-m», «inexistente»], stderr=subprocess.PIPE) >>> stderr = p.communicate()[1] >>> stderr ‘C:\Python27\python.exe: No module named inexistentern’Code language: JavaScript (javascript)
И stdout, и stderr опционально принимают файлы для хранения данных на диске:
with open(«errores.log», «w») as f: p = subprocess.run([«python», «-m», «inexistente»], stderr=f)Code language: JavaScript (javascript)
with open(«errores.log», «w») as f: p = subprocess.Popen([«python», «-m», «inexistente»], stderr=f)Code language: JavaScript (javascript)
Также можно перенаправить все, что отправлено в stderr, в stdout:
>>> p = subprocess.run([«python», «-m», «inexistente»], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) >>> p.stdout b’C:\python35\python.exe: No module named inexistentern’Code language: JavaScript (javascript)
>>> p = subprocess.Popen([«python», «-m», «inexistente»], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) >>> stdout = p.communicate()[0] >>> stdout ‘C:\Python27\python.exe: No module named inexistentern’Code language: JavaScript (javascript)
Чтобы отправить данные на вход (stdin), давайте сначала рассмотрим следующий пример кода:
#!/usr/bin/env python # -*- coding: utf-8 -*- try: # Python 2. name = raw_input(«Имя: «) except NameError: # Python 3. name = input(«Имя: «) print(«Привет » + name)Code language: PHP (php)
Этот небольшой код, назовем его program.py, предлагает пользователю ввести свое имя, а затем выводит на экран приветствие.
Через подпроцесс мы можем вызвать его, программно ввести имя и получить приветствие в виде строки Python.
p = subprocess.run([«python», «program.py»], input=b»Иван», stdout=subprocess.PIPE) print(p.stdout)Code language: PHP (php)
p = subprocess.Popen([«python», «program.py»], stdin=subprocess.PIPE, stdout=subprocess.PIPE) stdout = p.communicate(input=»Иван»)[0] print stdoutCode language: PHP (php)
Имя передается через входной параметр (из функций run() или communicate() в зависимости от версии) на вход (stdin), а приветствие получается путем обращения к содержимому выхода (stdout).
Другие допустимые аргументы для popen(), call() и run() включают cwd (текущий рабочий каталог), который указывает место, где будет выполняться команда или программа.
Это обычно полезно, когда процесс обращается к файлам по относительному пути.
>>> subprocess.run(«ls», cwd=»Desktop»)Code language: JavaScript (javascript)
>>> subprocess.call(«ls», cwd=»Desktop»)Code language: JavaScript (javascript)
Экземпляры Popen() включают методы terminate() и kill(), чтобы завершить или убить процесс, соответственно.
Дистрибутивы Linux различают сигналы SIGTERM и SIGKILL. В Windows нет никакой разницы между этими двумя функциями.
# Преждевременное прекращение процесса. p = subprocess.Popen([«python», «—version»]) p.terminate()Code language: PHP (php)
Другие методы включают p.wait() для блокировки выполнения до тех пор, пока программа не завершится (это происходит по умолчанию при вызове call() или run()) и атрибут p.pid, который хранит идентификатор созданного процесса.
Источник: dvsemenov.ru