您可以使用Python创建Mac OS X服务吗?怎么样?
我想要做的是知道将我的Python-fu挂钩到Mac OS X提供的服务系统。 谁知道怎么样?如果是,任何工作代码片段?只能在文本上或在给定的mimetype - 定义的对象上工作吗?
答案 0 :(得分:12)
打开Automator.app并创建新服务。
从左侧操作列表中选择“Utilities”,然后将“Run Shell Script”操作拖到工作流程中。
选择/usr/bin/python
作为您的shell。
键入一些python。例如:
import sys
for f in sys.stdin:
print "Hello World: " + f,
将服务保存为“测试”
在TextEdit.app中试用。键入一些文本,选择文本,然后选择TextEdit - >服务 - >从菜单中测试。它应该在文本的每一行前面加上“Hello World:”(根据python代码for f in sys.stdin
)
以上示例适用于文本。据推测,它可以修改为与OS X服务系统提供的其他数据类型一起使用。
答案 1 :(得分:2)
如何实施 - 我想说有三种可能性:
输入类型 - 如果要将服务定义为仅在选择了某些内容(例如文本或URL)时显示,则可以在该服务的Info.plist中定义此项。我认为应该可以编辑Automator生成的Info.plist,如果你想进一步自定义它。
有一种使用TextEdit调试服务的好方法,它在下面提到的文档中有描述。例如,它可以帮助调试服务未显示在菜单中的原因。 更多信息可以在Apple's service implementation guide
中找到答案 2 :(得分:2)
使用Python构建OS X服务的一种方法是将Python应用程序与py2app捆绑在一起,然后编辑Info.plist文件以在“服务”菜单中提供所需的菜单项。 可以在http://pythonhosted.org/pyobjc/examples/Cocoa/AppKit/SimpleService/index.html找到示例plist文件 您需要构建功能以接受您在Info.plist的NSMessage部分中定义的命令(请参阅上面提到的链接)。您可以使用PyObjC执行此操作。 这比使用Automator要复杂一点,但其优点是可以将整个功能捆绑到一个App中。
答案 3 :(得分:1)
当我尝试制作python服务时,我找到了这个页面。我想分享我的完整解决方案,以便节省一些时间,也许可以从更有经验的编码员那里得到一些反馈。我使用System Preference> Keyboard:Keybindings为此服务设置“Application Sortcut:All Apps”,这样我就可以使用command-shift-return在系统中的任何位置执行所选文本。您会注意到任何异常都会导致选择被原始文本替换。如果您没有得到您所追求的结果,则与UNDO合作。到目前为止,我非常喜欢它!
创建一个automator工作流作为服务,服务在任何应用程序中接收所选文本,输入是整个选择,输出替换所选文本
添加一个run shell脚本动作,shell:/ usr / bin / python pass input:as arguments
此代码包含在框中:
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