从 Mac 中的 App 向终端应用程序传递 shell 命令

Passing shell command to a terminal application from an App in Mac

我已经使用 Py2app 成功冻结了一个基于 python 的 GUI 脚本,但是我 运行 在 Mac 上使用这个应用程序时遇到了麻烦。此应用程序应该发送 arguments/parameters 到基于终端的应用程序 Clustal,但它却 returns 一个错误 非零退出状态 127,'/bin/sh: clustal : 找不到命令'

我发现当我从 Frozen_apl.app>Contents>MacOS 执行相同的应用程序时,我冻结的应用程序可以成功发送 shell 命令>Frozen_apl(这是一个 UNIX 可执行文件)。

为什么这些 shell 命令直接从应用程序传递时会被阻止?我怎样才能解决这个问题?

注意:Clustal安装正确,路径设置正确。我使用 OS X 10.9。我为 Ubuntu 和 Windows 冻结了相同的脚本,它们工作得很好。

[基于评论中的讨论] 这不是参数的问题,这是因为生成的 shell 无法找到 clustal 可执行文件。我不确定这是为什么,因为它在 /usr/local/bin/clustal 中,而且 /usr/local/bin 在 OS X 的默认路径中(它列在 /etc/paths 中)。使用可执行文件的完整路径有效,因此冻结的应用程序似乎正在生成一个 shell 和一个非默认路径。

在冻结的应用程序中包含完整路径 (/usr/local/bin/clustal) 并不是真正的最佳解决方案;最好弄清楚如何在生成的 shell 中获得正常的 PATH。但我现在对 Py2app 足够熟悉,知道如何执行此操作。 (JeeYem:请在评论或其他答案中给出您提出的解决方法。)

引用自 Py2app 0.6.4 次要功能发布:

Issue #15: py2app now has an option to emulate the shell environment you get by opening a window in the Terminal.

Usage: python setup.py py2app --emulate-shell-environment

This option is experimental, it is far from certain that the implementation works on all systems.

在 Py2app 中使用此选项解决了 Py2app-frozen 应用程序与 Os X shell 之间通信受阻的问题。