2013-09-28 2 views
-1

Я хочу обработать команду1 с помощью popen (python), а затем запустить другую команду2, когда первый закончен. когда я использую wait(), чтобы заставить его работать, но это не сработало. Кто-нибудь может мне помочь?Как заставить wait() полностью подождать подпроцесса? wait() не может работать

def ant_debug(): 
    ant_debug_cmd = 'cmd /k ant debug' 
    os.system(ant_debug_cmd) 

def adb_install(): 
    apk_debug_path = walk_dir('.\\bin') 
    adb_install_cmd = 'cmd /k adb install -r ' + apk_debug_path 
    os.system(adb_install_cmd) 

child = subprocess.call(ant_debug()) 
if child.wait() == 0: 
    adb_install() 
+2

Вы действительно не сказали нам, что не так, когда вы запускаете этот код. * он не работает * не является частью сообщения об ошибке. –

ответ

1

Существует несколько проблем с вашим кодом, и это не сюрприз, который он не запускает.

При использовании subprocess.call() не нужно звонить .wait(). Эта функция заботится о звонке Process.wait()для вас.

Вместо этого subprocess.call() возвращает код выхода напрямую. Цитируя subprocess.call() documentation:

Выполнить команду, описанную арг. Дождитесь завершения команды, затем верните атрибут returncode.

Emphasis mine.

Кроме того, ваша функция ant_debug() ничего не возвращает (не говоря уже о команде для запуска). Вместо этого он запускает команду ant, используя os.system()! Удалите этот звонок все вместе. Использовать subprocess.call()вместо от os.system().

Переписывая свой код, чтобы использовать толькоsubprocess.call() будет:

retcode = subprocess.call(['ant', 'debug']) 

if retcode == 0: 
    apk_debug_path = walk_dir('.\\bin') 
    adb_install_cmd = ['adb', 'install', '-r', apk_debug_path] 
    subprocess.call(adb_install_cmd) 

где мы переходим в команду для запуска и ее аргументы в виде списка строк.

Я удалил префикс cmd /k; просто запустите antнапрямую; здесь не нужна оболочка. Переключатель /k даже предотвращаетcmd оболочка от закрытия. Возвращаемое значение cmd не обязательно совпадает с возвратом ant.

0

В дополнение к комментариям Мартейн на subprocess.call, «cmd/к» означает для выполнения команды , а затем продолжить - так это не закончится, пока вы не скажете CMD, чтобы выйти. Вероятно, нет необходимости запускать команду ant с помощью cmd, поэтому просто удалите эти первые два элемента из списка вызовов. Если вы хотите запустить команду через оболочку, такую ​​как cmd, вы можете передать аргумент shell=True (но узнайте , почему во-первых, есть риски).