Можете ли вы создать службу 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