Как мне встроить AppleScript в скрипт Python? - PullRequest
10 голосов
/ 31 мая 2010

Я пытаюсь встроить AppleScript в скрипт Python. Я не хочу сохранять AppleScript как файл, а затем загружать его в свой скрипт Python Есть ли способ ввести AppleScript как строку в Python и заставить Python выполнять AppleScript? Большое спасибо.

Вот мой сценарий: подпроцесс импорта импорт ре импорт ОС

def get_window_title():
    cmd = """osascript<<END
    tell application "System Events"
        set frontApp to name of first application process whose frontmost is true
    end tell
    tell application frontApp
        if the (count of windows) is not 0 then
            set window_name to name of front window
        end if
    end tell
    return window_name
    END"""

    p = subprocess.Popen(cmd, shell=True)
    p.terminate()
    return p

def get_class_name(input_str):
    re_expression = re.compile(r"(\w+)\.java")
    full_match = re_expression.search(input_str)
    class_name = full_match.group(1)
    return class_name

print get_window_title()

Ответы [ 7 ]

21 голосов
/ 31 мая 2010

Использование подпроцесс :

from subprocess import Popen, PIPE

scpt = '''
    on run {x, y}
        return x + y
    end run'''
args = ['2', '2']

p = Popen(['osascript', '-'] + args, stdin=PIPE, stdout=PIPE, stderr=PIPE)
stdout, stderr = p.communicate(scpt)
print (p.returncode, stdout, stderr)
5 голосов
/ 31 мая 2010

Пример 3 в этой статье предлагает:

#!/usr/bin/env python
#sleepy-mac.py
#makes my mac very sleepy

import os
cmd = """osascript -e 'tell app "Finder" to sleep'"""
def stupidtrick():
     os.system(cmd)
stupidtrick()

Однако в наши дни subsystem.Popen обычно предпочтительнее, чем os.system (статья написана три года назад, когда никто не кричал, увидев os.system звонок; -).

4 голосов
/ 17 июля 2017

В питоне 3 это будет немного иначе:

script = 'tell "some application" to do something'
p = Popen(['osascript', '-'], stdin=PIPE, stdout=PIPE, stderr=PIPE, universal_newlines=True)
stdout, stderr = p.communicate(script)

Попен теперь ожидает, что байтовидный объект передаст строку, необходим параметр universal_newlines=True.

1 голос
/ 31 мая 2010

Вместо встраивания AppleScript я бы вместо этого использовал appscript . Я никогда не использовал версию Python, но в Ruby это было очень приятно. И убедитесь, что, если вы устанавливаете его на Snow Leopard, у вас установлена ​​последняя версия XCode. Однако мне пока не удалось установить его на Snow Leopard. Но у меня был Snow Leopard всего ~ 1 день, поэтому ваш пробег может отличаться.

0 голосов
/ 01 февраля 2018

Вот простой пример синхронного Python3, если вы хотите, чтобы ваш код Python не ожидал завершения Applescript. В этом примере обе команды say выполняются параллельно.

from subprocess import Popen

def exec_applescript(script):
    p = Popen(['osascript', '-e', script])

exec_applescript('say "I am singing la la la la" using "Alex" speaking rate 140 pitch 60')
exec_applescript('say "Still singing, hahaha" using "Alex" speaking rate 140 pitch 66')
0 голосов
/ 30 сентября 2016

Вы можете использовать os.system:

import os
os.system('''
    osascript -e 
     '[{YOUR SCRIPT}]'
     '[{GOES HERE}]'
    ''')

или, как предлагает Алекс Мартелли, вы можете использовать переменную:

import os
script = '''
    [{YOUR SCRIPT}]
    [{GOES HERE}]
'''
os.system('osascript -e ' + script)
0 голосов
/ 15 июля 2013

Вот общая функция в Python.Просто передайте свой яблочный код с / без аргументов и верните значение в виде строки.Благодаря этому ответу.

from subprocess import Popen, PIPE

def run_this_scpt(scpt, args=[]):
    p = Popen(['osascript', '-'] + args, stdin=PIPE, stdout=PIPE, stderr=PIPE)
    stdout, stderr = p.communicate(scpt)
    return stdout

#Example of how to run it.
run_this_scpt("""tell application "System Events" to keystroke "m" using {command down}""")

#Example of how to run with args.
run_this_scpt('''
    on run {x, y}
        return x + y
    end run''', ['2', '2'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...