2014-11-21 3 views
2

Пытается использовать python для управления многочисленными скомпилированными исполняемыми файлами, но работает с проблемами в хронологии! Мне нужно иметь возможность запускать два исполняемых файла одновременно, а также иметь возможность «ждать», пока исполняемый файл не завершит работу до запуска другого. Кроме того, некоторые из них требуют суперпользователя. Вот то, что я до сих пор:Python работает синхронно? Запуск одного исполняемого файла за один раз

import os 
sudoPassword = "PASS" 
executable1 = "EXEC1" 
executable2 = "EXEC2" 
executable3 = "EXEC3" 
filename = "~/Desktop/folder/" 
commandA = filename+executable1 
commandB = filename+executable2 
commandC = filename+executable3 
os.system('echo %s | sudo %s; %s' % (sudoPassword, commandA, commandB)) 
os.system('echo %s | sudo %s' % (sudoPassword, commandC)) 
print ('DONESIES') 

Предполагая, что os.system() ожидает исполняемый файл, чтобы закончить до перехода к следующей строке, это должно работать EXEC1 и EXEC2 одновременно, и после того, как они заканчивают работать EXEC3 ... Но это не так. На самом деле, он даже печатает «DONESIES» в оболочке, прежде чем команда B даже закончит ... Пожалуйста, помогите!

+0

Вы перекрывая 'os.system'. Вызов функции вместо присвоения ему: 'os.system ('эхо% s | Суд% s' % (sudoPassword, commandC))' – utdemir

+0

использования 'из подпроцесса импорта вызова' не уверен, что я могу использовать в качестве суперпользователя , Я пытался использовать IDLE как sudo, но он не обрабатывает команды в 'call()' как sudo. Не могли бы вы объяснить немного дальше? – ovadaflame

+0

Что вы хотите делать с stdout/stderr вызываемых программ? Отображать на экране ... записывать в файл журнала? – tdelaney

ответ

1

Ваш скрипт будет по-прежнему выполнять все 3 команды последовательно. В сценариях оболочки точка с запятой - это всего лишь способ разместить более одной команды в одной строке. Он не делает ничего особенного, он просто запускает их один за другим.

Если вы хотите запускать внешние программы параллельно с программой Python, используйте модуль subprocess: https://docs.python.org/2/library/subprocess.html

+1

Ошибка синтаксиса, я не должен был иметь '=' между 'os.system' и' ('echo ... ', который был обновлен выше. – ovadaflame

+0

Моя точка зрения на последовательное выполнение все еще стоит. Прочитайте документацию для' subprocess.Popen'. –

1

Используйте subprocess.Popen для запуска нескольких команд в фоновом режиме. Если вы просто хотите, чтобы stdout/err программы выходил на экран (или полностью сбрасывался), он довольно прямолинейный. Если вы хотите обработать вывод команд ..., который становится более сложным. Вероятно, вы начнете поток за команду.

Но вот случай, который соответствует вашему примеру:

import os 
import subprocess as subp 

sudoPassword = "PASS" 
executable1 = "EXEC1" 
executable2 = "EXEC2" 
executable3 = "EXEC3" 
filename = os.path.expanduser("~/Desktop/folder/") 
commandA = os.path.join(filename, executable1) 
commandB = os.path.join(filename, executable2) 
commandC = os.path.join(filename, executable3) 

def sudo_cmd(cmd, password): 
    p = subp.Popen(['sudo', '-S'] + cmd, stdin=subp.PIPE) 
    p.stdin.write(password + '\n') 
    p.stdin.close() 
    return p 

# run A and B in parallel 
exec_A = sudo_cmd([commandA], sudoPassword) 
exec_B = sudo_cmd([commandB], sudoPassword) 

# wait for A before starting C 
exec_A.wait() 
exec_C = sudo_cmd([commandC], sudoPassword) 

# wait for the stragglers 
exec_B.wait() 
exec_C.wait() 

print ('DONESIES') 
Смежные вопросы