2011-04-03 24 views
13

你能用Python創建一個Mac OS X服務嗎?怎麼樣 ?你能用Python創建一個Mac OS X服務嗎?怎麼樣?

我想要做的是知道鉤我的Python-fu到Mac OS X提供的服務系統。 任何人都知道如何?如果是的話,任何工作代碼片段?只能在文本上或者在給定的mimetype定義的對象上工作?

Service Popup

回答

12
  • 打開Automator.app並創建一個新的服務。

  • 從左側操作列表中選擇「實用程序」,然後將「運行Shell腳本」操作拖到工作流中。

  • 選擇/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服務系統提供的其他數據類型一起工作。

+0

您需要選擇「替換所選文字」複選框才能使用。它也只會做一個「Hello World」;每行不是一個。你需要將sys.stdin分解爲它的組件行來返回每一行。 – dawg 2011-04-03 15:49:44

+0

以及「替換選定的文本」複選框位於何處? – 2013-10-12 13:21:50

+0

可以導出到應用程序(即可下載的.app)嗎? – 2016-10-08 23:32:19

2

如何實現 - 我會說,有三種可能性:

  1. 你可以使用的Automator,並創建一個運行shell腳本動作的服務。
  2. 您可以使用Xcode自己編寫一個Automator操作,並在Automator中使用它,並從中創建一個新的服務。好處是你可以爲它編寫一個UI。您使用綁定將其綁定到文件的所有者對象。綁定鍵然後作爲環境變量反映在腳本中。
  3. 創建獨立服務或與應用程序一起使用的服務。我已經實施了一個包含在應用程序中。在那裏你也可以爲服務定義一個單獨的UI。

輸入類型 - 如果要將服務定義爲僅在選擇某些內容(如文本或URL)時才顯示,則可以在該服務的Info.plist中定義此項。我認爲應該可以編輯由Automator生成的Info.plist,如果您想進一步自定義它。

有一種使用TextEdit調試服務的好方法,它在下面提到的文檔中有描述。例如,它爲調試服務未出現在菜單中的原因提供了很大的幫助。 更多信息可在Apple's service implementation guide

0

我在試圖製作python服務時發現此頁。我想分享我的完整解決方案來節省時間,也許會從更有經驗的編程人員那裏獲得一些反饋。我使用系統首選項>鍵盤:鍵盤綁定爲這項服務設置了「應用程序分解:所有應用程序」,因此我可以使用command-shift-return在系統中的任何位置執行選定的文本。您會注意到任何例外都會導致選擇被替換爲原始文本。如果你沒有得到你以前的結果,則與UNDO合作。到目前爲止,我非常喜歡它!

創建一個自動機工作流作爲一種服務,服務接收在任何應用程序中選擇的文本,輸入是整個選擇,輸出替換所選文本

添加運行外殼腳本操作,殼:在/ usr/bin中/蟒通輸入:作爲參數

此代碼放在盒子:

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:]) 

這些都是我怎麼可能會使用這項服務了幾樣。再次,這在郵件,文字處理器和其他應用程序中起作用。

樣品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 
1

使用Python構建OS X服務的一種方法是將Python應用程序與py2app捆綁在一起,並編輯Info.plist文件以在服務菜單中提供所需的菜單條目。 示例plist文件可以在http://pythonhosted.org/pyobjc/examples/Cocoa/AppKit/SimpleService/index.html 找到您需要構建功能以接受您在Info.plist的NSMessage部分中定義的命令(請參閱上面的鏈接)。你可以使用PyObjC來做到這一點。 這比使用Automator有點複雜,但具有可以將整個功能捆綁到一個App中的優勢。