Если вы хотите запускать инструменты командной строки как отдельные процессы, просто используйте os.system
(или лучше: модуль subprocess
), чтобы запустить их асинхронно.В Unix / Linux / Macos:
subprocess.call("command -flags arguments &", shell=True)
В Windows:
subprocess.call("start command -flags arguments", shell=True)
Как узнать, когда команда закончилась: В Unix вы можете настроить с wait
и т.д., но если вы пишете сценарии командной строки, я бы просто попросил их записать сообщение в файл и следить за файлом из вызывающего сценария python.
@ Джеймс Янгман предложил решение вашего второго вопросаСинхронизация.Если вы хотите управлять своими процессами из Python, вы можете запустить их асинхронно с помощью Popen.
p1 = subprocess.Popen("command1 -flags arguments")
p2 = subprocess.Popen("command2 -flags arguments")
Помните, что если вы используете Popen и ваши процессы записывают много данных в стандартный вывод, ваша программа заходит в тупик.Обязательно перенаправьте весь вывод в файл журнала.
p1
и p2
- это объекты, которые вы можете использовать для отслеживания своих процессов.p1.poll()
не будет блокировать, но вернет None, если процесс все еще выполняется.Когда это будет сделано, он вернет статус выхода, поэтому вы можете проверить, равен ли он нулю.
while True:
time.sleep(60)
for proc in [p1, p2]:
status = proc.poll()
if status == None:
continue
elif status == 0:
# harvest the answers
else:
print "command1 failed with status", status
Выше приведена только модель: как написано, она никогда не выйдет и будет продолжать "сбор«Результаты завершенных процессов.Но я верю, что вы поняли идею.