Mac OS X app / service和stdin?

时间:2009-11-10 15:57:54

标签: python macos service py2app

我正在调试我正在开发的服务,它基本上会打开我的.app并将一些数据传递给stdin。但看起来似乎不太可能:

open -a myapp.app < foo_in.txt

是否可以将内容传递给.app的stdin?

修改: 对不起,我应该在SO上发布这个并且更清楚。我想要做的是我有一个用Python + py2app制作的应用程序。我希望能够在用户删除文件时将其处理,并将其用作服务。第一种情况不是问题,因为py2app有argv_emulation。我只是检查第一个参数是否是路径。

但是从stdin读取根本不起作用,无论我是如上所述还是管道,它都不会读取任何数据。如果我将stdin数据传递给实际的python主脚本,它可以工作。所以我重新解释一下我的问题,是否可以使用py2app包读取stdin?

5 个答案:

答案 0 :(得分:1)

将它用作服务是什么意思?

您显示的示例将不起作用,open命令调用LaunchServices来启动应用程序,并且LaunchServices API中没有地方传递stdin数据或类似于应用程序。

如果您要将项目添加到OS X服务菜单,则应查看introductory documentation for developers

答案 1 :(得分:0)

好吧,

open -a /Applications/myapp.app < foo_in.txt

将在myapp.app应用程序中打开foo_in.txt。您需要应用程序的完整路径,无论是应用程序,bin还是其他任何位置......

这取决于您的应用程序的功能。这可能更合适:

cat foo_in.txt | your_command_goes_here

这将读取foo_in.txt(使用cat)的内容并将它们传递给stdin(使用管道),因此您只需按照命令/应用程序进行操作即可。

答案 2 :(得分:0)

要以root身份启动Finder,使用

sudo open -a /System/Library/CoreServices/Finder.app

上面以root身份运行open,但仍然open以普通用户身份运行Finder。相反,人们会use

sudo /System/Library/CoreServices/Finder.app/Contents/MacOS/Finder

所以,在那之后,也许(我真的只是猜测)需要:

myapp.app/Contents/MacOS/myapp < foo_in.txt

答案 3 :(得分:0)

您几乎肯定会通过Mach端口或分布式对象执行此操作,或者几乎可以通过操作系统向您提供的任何其他应用程序通信方法。

答案 4 :(得分:0)

open创造了一个全新的过程。因此,请勿使用它将内容重定向到终端的应用程序。 你可以试试

./Foo.app/Contents/MacOS/Foo < Foo.txt

已经提到了cat Foo.txt | ./Foo.app/Contents/MacOS/Foo,这取决于你是否将Foo设置为executionrtbale并且它在你的路径中。在你的情况下,我会检查.app包中的Ressources文件夹,它可能包含另一个二进制文件。 A * .app包是一个目录。它无法处理命令行参数。