Я запускаю свою программу Python с моего компьютера с Ubuntu следующим образом:
[email protected]:/home/david/zookteck# python test.py
Но если я закрою свой терминал Ubuntu, тогда вся моя программа будет остановлена. Есть ли какой-нибудь способ запустить эту программу на Python в фоновом режиме, и если я закрою свой терминал, все равно он продолжит работать?
А также после запуска этой программы в фоновом режиме, как мне узнать мою реальную программу, работает ли она все еще или нет, если я снова захожу на этот терминал?
arsenal 28 дек ’13 в 03:19 2013-12-28 03:19
2013-12-28 03:19
2 ответа
Используйте линию Шебанга в своем python скрипт. Сделайте его исполняемым с помощью команды,
chmod +x test.py
Не используйте зависание для запуска программы в фоновом режиме, даже если вы закрываете свой терминал.
nohup /path/to/test.py поставить его в фоновом режиме.
Чтобы увидеть процесс снова, используйте в терминале,
ps ax | grep test.py
Источник: ask-ubuntu.ru
Как запускать python-скрипты с помощью bat/cmd файлов
Как запустить фоновый процесс в Python?
Я пытаюсь портировать сценарий оболочки на гораздо более читаемую версию Python. Оригинальный сценарий оболочки запускает несколько процессов (утилиты, мониторы и т. Д.) В фоновом режиме с помощью «. Как я могу добиться того же эффекта в Python? Я бы хотел, чтобы эти процессы не умирали после завершения сценариев Python. Я уверен, что это как-то связано с концепцией демона, но я не мог найти способ сделать это легко.
user120237 28 июл ’09 в 18:56 2009-07-28 18:56
2009-07-28 18:56
9 ответов
Примечание. Этот ответ является менее актуальным, чем он был опубликован в 2009 году. subprocess модуль, показанный в других ответах, теперь рекомендуется в документации
(Обратите внимание, что модуль подпроцесса предоставляет более мощные средства для порождения новых процессов и получения их результатов; использование этого модуля предпочтительнее использования этих функций.)
Если вы хотите, чтобы ваш процесс запускался в фоновом режиме, вы можете использовать system() и назовите его так же, как ваш скрипт, или вы можете spawn Это:
import os os.spawnl(os.P_DETACH, ‘some_long_running_command’)
(или, альтернативно, вы можете попробовать os.P_NOWAIT флаг).
user912 28 июл ’09 в 19:05 2009-07-28 19:05
2009-07-28 19:05
В то время как решение jkp работает, более новый способ работы (и способ, рекомендуемый документацией) состоит в том, чтобы использовать subprocess модуль. Для простых команд это эквивалентно, но он предлагает больше вариантов, если вы хотите сделать что-то сложное.
Пример для вашего случая:
import subprocess subprocess.Popen([«rm»,»-r»,»some.file»])
Это должно бежать rm -r somefile на заднем фоне. Но будьте осторожны: subprocess.Popen() только запускает процесс в фоновом режиме, если ничто в скрипте python не зависит от вывода выполняемой команды:
Python Selenium #7 Headless mode | Работа браузера в фоновом режиме
Например, следующая команда не будет работать в фоновом режиме:
import subprocess ls_output=subprocess.Popen([«ls», «-a»], stdout=subprocess.PIPE)
Кроме того, пояснение: «Фон» — это просто концепция оболочки: вам, вероятно, нужно создать новый процесс. Я использовал здесь «фон», чтобы ссылаться на поведение, похожее на оболочку, но не принимайте это за процесс, фактически находящийся в фоновом режиме.
user789750 28 авг ’11 в 21:47 2011-08-28 21:47
2011-08-28 21:47
Самый простой подход заключается в использовании os.system функция, например:
import os os.system(«some_command )
По сути, все, что вы передаете system Функция будет выполнена так же, как если бы вы передали ее в оболочку в скрипте.
user1694 28 июл ’09 в 19:02 2009-07-28 19:02
2009-07-28 19:02
Использование subprocess.Popen() с close_fds=True параметр, который позволит отделить порожденный подпроцесс от самого процесса Python и продолжить работу даже после выхода из Python.
import os, time, sys, subprocess if len(sys.argv) == 2: time.sleep(5) print ‘track end’ if sys.platform == ‘darwin’: subprocess.Popen([‘say’, ‘hello’]) else: print ‘main begin’ subprocess.Popen([‘python’, os.path.realpath(__file__), ‘0’], close_fds=True) print ‘main end’
user5443510 25 дек ’15 в 01:47 2015-12-25 01:47
2015-12-25 01:47
В Windows (Win XP) родительский процесс не завершится, пока longtask.py закончил свою работу. Это не то, что вы хотите в CGI-скрипте. Проблема не специфична для Python, в сообществе PHP проблемы одинаковы.
Решение состоит в том, чтобы пройти DETACHED_PROCESS Флаг создания процесса к базовому CreateProcess функция в Win API. Если вы установили pywin32, вы можете импортировать флаг из модуля win32process, в противном случае вы должны определить его самостоятельно:
DETACHED_PROCESS = 0x00000008 pid = subprocess.Popen([sys.executable, «longtask.py»], creationflags=DETACHED_PROCESS).pid
user1117641 27 ноя ’12 в 21:19 2012-11-27 21:19
2012-11-27 21:19
И захватывать вывод и работать на фоне с threading
Как уже упоминалось в этом ответе, если вы фиксируете вывод с stdout= а затем попытаться read() затем процесс блокируется.
Однако есть случаи, когда вам это нужно. Например, я хотел запустить два процесса, которые общаются через порт между ними, и сохранить их стандартный вывод в файл журнала и стандартный вывод.
threading Модуль позволяет нам сделать это.
Сначала рассмотрим, как выполнить часть перенаправления вывода в этом вопросе: Python Popen: одновременная запись в стандартный вывод и файл журнала
#!/usr/bin/env python3 import os import subprocess import sys import threading def output_reader(proc, file): while True: byte = proc.stdout.read(1) if byte: sys.stdout.buffer.write(byte) sys.stdout.flush() file.buffer.write(byte) else: break with subprocess.Popen([‘./sleep.py’, ‘0’], stdout=subprocess.PIPE, stderr=subprocess.PIPE) as proc1, subprocess.Popen([‘./sleep.py’, ’10’], stdout=subprocess.PIPE, stderr=subprocess.PIPE) as proc2, open(‘log1.log’, ‘w’) as file1, open(‘log2.log’, ‘w’) as file2: t1 = threading.Thread(target=output_reader, args=(proc1, file1)) t2 = threading.Thread(target=output_reader, args=(proc2, file2)) t1.start() t2.start() t1.join() t2.join()
#!/usr/bin/env python3 import sys import time for i in range(4): print(i + int(sys.argv[1])) sys.stdout.flush() time.sleep(0.5)
./main.py
stdout обновляется каждые 0,5 секунды для каждых двух строк:
0 10 1 11 2 12 3 13
и каждый файл журнала содержит соответствующий журнал для данного процесса.
Протестировано на Ubuntu 18.04, Python 3.6.7.
Источник: stackru.com
Как запустить скрипт Python в фоновом режиме/как процесс?
Я хочу запустить скрипт Python как процесс/в фоновом режиме. Я искал и нашел pythonw.exe , но когда я сделал pythonw.exe name_of_my_script.py , ничего не произошло. Я делаю что-то не так и / или как еще я могу запустить его в фоновом режиме? Это часть моего кода, которая создает проблему:
from selenium import webdriver
Я буду благодарен вам за любую помощь. примечание: С помощью комментариев здесь я понял, что также запущенный python.exe не работает и вызывает ошибку — NameError: имя ‘PROTOCOL_TLS’ не определено (даже в жестком режиме при нормальной работе оно не работает). не имеют ошибок. изменить: я использовал http://pytoexe.com/ и получил исполняемый файл, который работает, но консоль cmd все еще существует (может быть, потому что я использую phantomjs?) нажмите здесь
person omersk2 schedule 01.04.2018 source источник
ваш скрипт работает нормально, когда вы запускаете его с помощью python.exe? — person CodeCupboard nbsp schedule 01.04.2018
В Windows вам нужно создать службу Windows. Посмотрите Hammond nbsp schedule 01.04.2018
1. хм, когда я запускаю его с помощью python.exe, он делает ошибку — NameError: имя «PROTOCOL_TLS» не определено (когда я запускаю его в обычном режиме, у него нет никакой ошибки), может быть, это проблема? 2. я могу оставить оконный терминал открытым, но я хочу запустить его, не открывая ничего — даже терминала. думайте об этом как о вирусе — пользователь не знает, что он существует, он не оставляет после себя открытых программ, таких как терминал. 3. попробую спасибо — person omersk2 после команды. Для получения дополнительной информации: kb.iu.edu/d/afnz — person Joe Samanek nbsp schedule 01.04.2018
Вы должны изменить заголовок этого вопроса «фон» на «фон». — person NER1808 01.04.2018
Вам нужно выбрать оконный процесс, чтобы он был фоновым процессом. — person Jaguar Ro; 03.04.2018
Я выбрал вариант на основе окна — он не открывает консоль всего скрипта, но открывает консоль каждый раз, когда я использую phantomjs. — person omersk2; 03.04.2018
Источник: questu.ru