Как запустить и запустить внешний скрипт в фоновом режиме?

Я пробовал эти два метода:

os.system("python test.py")

subprocess.Popen("python test.py", shell=True)

Оба подхода должны дождаться завершения test.py, что блокирует основной процесс. Я знаю, что «nohup» справится с этой задачей. Есть ли способ Python запустить test.py или любые другие сценарии оболочки и оставить его работать в фоновом режиме?

Предположим, test.py выглядит так:

for i in range(0, 1000000):
    print i

И os.system (), и subprocess.Popen () будут блокировать основную программу до тех пор, пока не отобразится 1000000 строк вывода. Я хочу, чтобы test.py работал беззвучно и отображал только основной вывод программы. Основная программа может перестать работать, пока test.py все еще запущен.


person jack    schedule 22.10.2009    source источник


Ответы (2)


subprocess.Popen(["python", "test.py"]) должно работать.

Обратите внимание, что задание все еще может умереть, когда ваш основной скрипт завершится. В этом случае попробуйте subprocess.Popen(["nohup", "python", "test.py"])

person Aaron Digulla    schedule 22.10.2009
comment
subprocess.Popen ([python, test.py]) просто запускает test.py и блокирует основной процесс, ожидая вывода test.py. - person jack; 22.10.2009
comment
Это должно произойти только в том случае, если вы также запросите stdout=PIPE. Какая версия Python? Можете ли вы добавить print "xxx" после вызова Popen, чтобы проверить, действительно ли он блокируется? - person Aaron Digulla; 22.10.2009
comment
Я только что протестировал приведенный выше код, и у меня он работает с Python 2.5.2 в Windows. Ваша проблема, должно быть, в другом. - person Aaron Digulla; 22.10.2009
comment
Я попробовал еще раз, и это сработало. извините за ошибку и спасибо за ваш ответ. - person jack; 22.10.2009
comment
В Linux subprocess.Popen ([python, test.py]) эффективно блокирует основной процесс. - person igor; 19.11.2015
comment
@ user3073745: он не блокируется ни на одной платформе. Процессы по определению независимы друг от друга. Они могут заблокироваться, когда вы соедините их трубами. В этом случае сторона записи канала может заблокироваться, когда сторона чтения не выполняет свою работу. - person Aaron Digulla; 19.11.2015
comment
@AaronDigulla, на самом деле, согласно моему тесту subprocess.Popen ([python, test.py]) ничего не делает. Если вы хотите выполнить test.py, вам нужно добавить вызов для функции связи, и это блокирует: subprocess.Popen ([python, test.py]). Communication () - person igor; 19.11.2015
comment
@ user3073745: subprocess.Popen() - всегда только первый вызов длинного блока кода, который управляет обменом данными между двумя процессами. В этом случае нет ответа, который будет работать всегда. - person Aaron Digulla; 20.11.2015
comment
@AaronDigulla: Нет возможности просто запустить скрипт в отдельном процессе, не блокируя основной процесс? - person igor; 20.11.2015
comment
Есть много способов, но не самый простой. 1. Вы можете перенаправить stdio дочернего элемента в / dev / null. 2. Вы можете запустить его как фоновый процесс (чтобы вы больше не родитель). 3. Вы можете запускать потоки для обработки операций ввода-вывода, пока ваш основной поток продолжает работу. - person Aaron Digulla; 20.11.2015
comment
@AaronDigulla - Как отправить входные параметры, если они нужны скриптам Python. например: если я выполню этот файл py. def start_listner(unique_id, keyword, limit): #do something Это subprocess.Popen(["nohup", "python", "test.py"]) работает, но как я могу передать unique_id, ключевое слово и ограничение? - person Marlon Abeykoon; 18.12.2015
comment
@MarlonAbeykoon Я не могу ответить на это в комментарии. Пожалуйста, задайте новый вопрос. - person Aaron Digulla; 12.01.2016

person    schedule
comment
он работает, но можно ли, чтобы test.py работал беззвучно? - person jack; 22.10.2009
comment
молча? Вы имеете в виду, что не хотите видеть результат на экране? - person Vissu; 22.10.2009
comment
да, я не хочу видеть результат на экране. можно сделать, добавив в код ›› / dev / null? - person jack; 22.10.2009
comment
К сожалению, я думаю, что os.spawn * () не поддерживает перенаправление вывода! - person Vissu; 22.10.2009
comment
os.spawn* устарели модулем подпроцесса. - person habnabit; 23.10.2009