программно выполнять и завершать длительный пакетный процесс в Python - PullRequest
5 голосов
/ 10 сентября 2010

Я искал способ запуска и завершения длительных «пакетных заданий» в python. Прямо сейчас я использую os.system (), чтобы запустить длительное пакетное задание внутри каждого дочернего процесса. Как вы, наверное, догадались, «os.system ()» порождает новый процесс внутри этого дочернего процесса (процесс внука?), Поэтому я не могу убить пакетное задание из процесса прародителя. Чтобы обеспечить некоторую визуализацию того, что я только что описал:

Main (grandparent) process, with PID = AAAA
          |
          |------> child process with PID = BBBB
                         |
                         |------> os.system("some long-running batch file)
                                  [grandchild process, with PID = CCCC]

Итак, моя проблема в том, что я не могу убить процесс внука от бабушки и дедушки ...

У меня вопрос: есть ли способ запустить длительное пакетное задание внутри дочернего процесса и иметь возможность убить это пакетное задание, просто завершив дочерний процесс? Какие альтернативы os.system () я могу использовать, чтобы убить пакетное задание из основного процесса?

Спасибо !!

Ответы [ 3 ]

3 голосов
/ 10 сентября 2010

подпроцесс модуль является правильным способом порождения и управления процессами в Python.

из документов:

ПодпроцессМодуль позволяет создавать новые процессы, подключаться к их каналам ввода / вывода / ошибок и получать их коды возврата. Этот модуль предназначен для замены нескольких других, более старых модулей и функций , таких как:

os.system
os.spawn
os.popen
popen2
команды

так что ... если вы используете Python 2.4+, subprocess является заменой os.system

для остановки процессов, ознакомьтесь сметоды terminate() и communicate() объектов Popen.

2 голосов
/ 10 сентября 2010

Если вы работаете в Posix-совместимой системе (например, Linux или OS X), и после дочернего процесса не требуется запуск кода Python, используйте os.execv.В общем, избегайте os.system и используйте вместо него модуль subprocess.

0 голосов
/ 10 сентября 2010

Если вы хотите контролировать запуск и остановку дочерних процессов, вы должны использовать многопоточность. В этом случае смотрите не дальше, чем модуль threading Python.

...