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

Вот мой скрипт: import subprocess import re import os os

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()
14
dbmikus 31 Май 2010 в 05:08

6 ответов

Лучший ответ

Используйте подпроцесс:

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)
22
has 31 Май 2010 в 06:26

Вот общая функция в 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'])
0
Mark Chackerian 1 Фев 2018 в 04:14

Вот простой пример синхронного 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
Mark Chackerian 1 Фев 2018 в 19:40

В питоне 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.

4
gbonetti 16 Июл 2017 в 22:43

Вы можете использовать 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
user6536489user6536489 30 Сен 2016 в 01:10

Пример 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 ;-).

5
Alex Martelli 31 Май 2010 в 01:13