2016-10-25 6 views
0

У меня возникла проблема с моим скриптом python. Я использую python 3. Я использую функцию os.system для открытия приложения на своем mac. То, что я хотел бы сделать, - это «распечатать» компьютер, когда он закончит открытие. Проблема заключается в том, что сценарий печатает «сделано» до того, как приложение даже загрузится. Приложение запускается, но сценарий печатает «сделано» до того, как приложение будет полностью запущено. Это мой сценарий:Ожидание завершения команды os.system

import os 

os.system('open "/Applications/Pages.app"') 
print("done.") 

Plz помочь

Заранее спасибо

+1

Почему бы вам не использовать ['subprocess'] (https://docs.python.org/3/library/subprocess.html)? – CoryKramer

+0

ive попробовал использовать подпроцесс, dosent сделать разницу –

+3

Это не проблема с Python, это проблема с 'open' возвращением и выходом, когда он дал указание операционной системе открыть приложение. 'open' не ждет. –

ответ

0

код на самом деле работает, как это должно быть. Может показаться, что команда open - это что-то, что запускает процесс открытия - например, запуск стартера на вашем автомобиле. Open сообщит, что ваше приложение откроется, а затем оно вернется, сообщив вам, удалось ли ему перевернуть мяч. Тем временем приложение, которое вы открыли, будет проходить через свой процесс инициализации, пока он не будет полностью запущен.

Я не уверен, как вы можете сказать, когда ваша программа полностью запущена, а просто установите таймер на произвольное количество секунд. Возможно, вы сможете получить обоснованное предположение, просмотрев список процессов на вашем компьютере?

0

open - это команда, которая запускает приложение как отдельную задачу. Если вы хотите дождаться завершения, вам нужно будет запустить исполняемый файл внутри приложения (.app - это просто суффикс для каталогов).

Но вы не хотите, чтобы сделать это: Само приложение обрабатывает все нагрузки, MacOS является (возможно, у меня на самом деле ни малейшего представления вообще о том, как работают операционные системы) просто скопировав все биты и байты из этот исполняемый файл в ОЗУ; а затем запускает планировщик из операционной системы.

Некоторые приложения открывают окно напрямую, но не все делают. Иногда это вызовы, которые выполняются через некоторые библиотеки, и обычно это занимает некоторое время. Поэтому попытка измерить время, необходимое для открытия окна, также не работает (и приложения могут также инициализировать другие вещи, а измерение времени для таких задач - отличный способ справиться с такими проблемами).

Решение следующее: Вы хотите возобновить, если окно этой программы будет открыто, правильно? Если вы знаете имя процесса, это довольно легко:

import os 
import subprocess 

devnull = open(os.devnull, 'w') 
script = """ 
tell application "System Events" 
    set frontApp to first application process whose name is "{}" and frontmost is true 
end tell 
""" 

... 

while subprocess.check_call(["osascript", "-e", script.format("name_of_the_process")], stdout=devnull, stderr=devnull) != 0: 
    pass 

osascript работает AppleScript «приложение», в этом случае приложение, которое пытается получить этот процесс с именем, при условии, что должно иметь окно то есть сверху. Это имя каталога без конечного «.app», я бы предположил. Это не работает, если это приложение не открывается, оставив нам ненужный код выхода (-1719 в этом случае), в то время как у него нет проблем, если приложение открыто. Переменная задана, и сценарий завершается, оставляя нас с кодом 0 в качестве кода выхода.

Если вы хотите только, чтобы процесс появился, удалите and frontmost is true из кода AppleScript в переменной script.

Мой код работает, как и ожидалось, на моем Mac, но он печатает на стандартный вывод.

+0

Я пробовал это в своем коде, но это дает мне ошибку: subprocess.CalledProcessError, поэтому я попытался сделать попытку, кроме выражения, но это тоже не сработало. @CodingLambdas –

+0

@NoahChalifour это действительно сработало для меня. Можете ли вы выслать мне полную ошибку? – CodenameLambda

0

Если вы действительно хотите, чтобы вы описали поведение, я предлагаю вам посмотреть в направлении автоматизации пользовательского интерфейса и доступности OS X. Например, пакет python atomac, который может помочь вам подождать до его загрузки.

1) Что вам нужно для определения «симптомов» завершенной загрузки, к которым можно получить доступ через автоматизацию пользовательского интерфейса.

2) Подождите, пока не появятся «симптомы».

3) Все готово.

Смежные вопросы