Можете ли вы создать службу Mac OS X с Python? Как?
Можете ли вы создать службу Mac OS X с Python? Как?
Что я хочу сделать, так это узнать, как подключить Python-fu к системе обслуживания, предоставляемой Mac OS X.
Кто-нибудь знает как? Если да, то какой-либо фрагмент рабочего кода? Будет работать только по тексту или также по заданному объекту, заданному mimetype?
![Service Popup]()
Ответы
Ответ 1
-
Откройте Automator.app и создайте новую службу.
-
Выберите "Утилиты" в списке действий слева, а затем перетащите действие "Запустить оболочку Script" в рабочий процесс.
-
Выберите /usr/bin/python
в качестве оболочки.
-
Введите некоторый python. Например:
:
import sys
for f in sys.stdin:
print "Hello World: " + f,
-
Сохраните услугу как, скажем, "Тест"
-
Попробуйте в TextEdit.app. Введите текст, выберите текст, затем в меню выберите TextEdit → Services → Test. Он должен добавить "Hello World:" в каждую строку текста (в соответствии с кодом python for f in sys.stdin
)
Приведенный выше пример работает с текстом. Предположительно, он может быть изменен для работы с другими типами данных, предоставляемыми через систему OS X Services.
Ответ 2
Как реализовать - я бы сказал, что есть три возможности:
- Вы можете использовать Automator и создать сервис из действия оболочки script.
- Вы можете сами написать действие Automator с помощью Xcode и использовать его в Automator и создать из него новую службу. Преимущество в том, что вы можете написать для него интерфейс. Вы используете привязки для привязки к объекту владельца файла. Затем ключи привязки отражаются в переменных script как переменных среды.
- Создайте автономную службу или службу, вместе с приложением. Я реализовал один, включенный в приложение. Там вы также можете определить отдельный пользовательский интерфейс только для службы.
Типы ввода. Если вы хотите, чтобы служба отображалась только в том случае, если определенные вещи выбраны, например текст или URL-адреса, вы должны определить это в Info.plist этой службы. Я думаю, что должно быть возможно отредактировать Info.plist, который был сгенерирован Automator, если вы хотите его настроить.
Существует отличный способ отладки службы, использующей TextEdit, и описан в документах, упомянутых ниже. Это дает большую помощь для отладки, почему услуга не отображается в меню, например.
Более подробную информацию можно найти в Руководство по внедрению службы Apple
Ответ 3
Один из способов создания службы OS X с использованием Python - связать ваше приложение Python с py2app и отредактировать файл Info.plist, чтобы предоставить нужные вам пункты меню в меню "Сервис".
Пример файла plist можно найти на http://pythonhosted.org/pyobjc/examples/Cocoa/AppKit/SimpleService/index.html
Вам необходимо создать функциональность, чтобы принять команды, определенные вами в разделе NSMessage Info.plist(см. Ссылку, упомянутую выше). Вы можете использовать PyObjC для этого.
Это немного сложнее, чем использование Automator, но имеет то преимущество, что вы можете объединить всю функциональность в одно приложение.
Ответ 4
Я нашел эту страницу, когда пытался создать службу python. Я хотел поделиться своим полным решением, чтобы немного спасти других и, возможно, получить отзывы от более опытных кодеров. Я использовал System Preference > Keyboard: Keybindings для установки "Application Sortcut: All Apps" для этой службы, чтобы я мог выполнять выделенный текст в любой точке системы с помощью команды shift-return. Вы заметите, что любые Исключения приведут к тому, что выбор будет заменен исходным текстом. Работает с UNDO, если вы не получили результат, которого вы добились. Пока мне это очень нравится!
Создайте рабочий процесс автомата в качестве службы, служба получает выделенный текст в любом приложении, ввод - весь выбор, вывод заменяет выделенный текст
Добавить команду run shell script action, shell: вход /usr/bin/python pass: как аргументы
Этот код находится в поле:
import sys #, random
try:
print eval(' '.join(sys.argv[1:]))
except:
try:
#This is a compound statement using variable assignment
code = compile(' '.join(sys.argv[1:]), '<string>', 'exec')
exec code
except:
print ' '.join(sys.argv[1:])
Вот несколько примеров того, как я могу использовать эту службу. Опять же, это работает в Mail, текстовых процессорах и других приложениях.
Пример 0: Базовая математика
>>> 42*24*60*60
3628800
Пример 1: одиночная строка, составная заявка
>>> import random; foo = range(17); random.shuffle(foo); print(foo)
[11, 14, 12, 3, 1, 4, 15, 7, 8, 13, 2, 16, 0, 10, 9, 6, 5]
Пример 2: многострочный
>>> import random
>>> foo = range(17)
>>> random.shuffle(foo)
>>> print(foo)
[5, 16, 14, 10, 3, 11, 7, 15, 12, 0, 13, 2, 4, 1, 6, 9, 8]
Пример 3: Циклы
>>> for x in range(5):
... print x
...
0
1
2
3
4