【问题标题】:Mac OS X app/service and stdin?Mac OS X 应用程序/服务和标准输入?
【发布时间】:2009-11-10 15:57:54
【问题描述】:

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

open -a myapp.app < foo_in.txt

是否可以将内容传递给 .app 的标准输入?

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

但是从标准输入读取根本不起作用,无论我是否按照上面的示例进行操作或管道它,它都不会读取任何数据。如果我将标准输入数据传递给实际的 python 主脚本,它就可以工作。所以我重新提出我的问题,是否可以使用 py2app 包从标准输入读取?

【问题讨论】:

  • (我想知道上面的命令行是否不会通过管道进入open而不是myapp.app?)

标签: python macos service py2app


【解决方案1】:

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

您展示的示例不起作用,打开命令调用 LaunchServices 来启动应用程序,并且 LaunchServices API 中没有地方可以将标准输入数据或类似的数据传递给应用程序。

如果您的意思是向 OS X 服务菜单添加项目,您应该查看introductory documentation for developers

【讨论】:

  • 谢谢,是的,我的意思是服务菜单,这就是我要找的。我将不得不调查是否可以使用 py2app 以这种方式开发服务。
【解决方案2】:

嗯,

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

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

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

cat foo_in.txt | your_command_goes_here

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

【讨论】:

  • 你试过了吗?还是您的意思是将在您的 myapp.app 应用程序中打开 foo_in.txt 的内容
  • open 命令将在 GUI 的应用程序中打开一个文件。第二个示例将内容传递给标准输入。 your_command_goes_here 也可以产生同样的效果
  • 所以,contents确实如此。仍然:你试过这个吗?显然提问者也尝试了同样的方法(肯定是为提问者打开了应用程序,但它不知何故没有获得传入的文件内容)。
  • 是的,猫 foo_in.txt | your_command_goes_here 肯定会将文件内容传递给管道后的命令。管道后面的命令必须能够识别标准输入,所以也许我们只需要从原始海报中获得更多关于他们到底在做什么的细节。
【解决方案3】:

要以 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 
    

【讨论】:

  • myapp.app/Contents/MacOS/myapp 不是unix命令,只是一个路径。我认为原始海报正试图将标准传递给他们的命令。如果他们试图将标准传递给将涉及 Apple Script 的 GUI 应用程序。
  • 你要失去我了。在我的示例中,myapp.app/Contents/MacOS/myappFinder.app/Contents/MacOS/Finder 一样多是命令(可执行文件)(定义为捆绑包的 info.plist 中的可执行文件)。
  • 我的错,你说得对,它不仅仅是一条路径,但我认为不可能将标准输入传递给 GUI 应用程序的可执行文件,尽管它可以用 Apple Script 完成就像我说的。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    open 创建一个全新的进程。因此,不要使用它将内容从终端重定向到应用程序。 你可以试试

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

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

    【讨论】:

      猜你喜欢
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-14
      • 2014-02-10
      相关资源
      最近更新 更多