【问题标题】:Passing shell command to a terminal application from an App in Mac从 Mac 中的应用程序将 shell 命令传递给终端应用程序
【发布时间】:2015-02-10 23:57:54
【问题描述】:

我已经成功地使用 Py2app 冻结了一个基于 python 的 GUI 脚本,但是我在 Mac 上使用这个应用程序时遇到了麻烦。这个应用程序应该向基于终端的应用程序 Clustal 发送参数/参数,但它反而返回错误非零退出状态 127, '/bin/sh: clustal: command not found' .

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

为什么这些 shell 命令在直接从应用程序传递时会被阻止?我该如何解决这个问题?

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

【问题讨论】:

  • 这看起来不像是参数的问题,而是寻找clustal 本身的问题。您说它已正确安装并设置了路径,但它在哪里,您如何设置 PATH? (请注意,每个进程都有自己的 PATH,仅仅因为您在交互式 shell 中设置它并不意味着它会为您的应用生成的 shell 设置。)
  • @GordonDavisson,感谢您的评论! Clustal 安装在 /usr/local/bin/ 中,并且路径设置在 .bash_profile 中,如果这是您所要求的。你能想到为什么它在应用程序目录中运行 UNIX 可执行文件但在运行应用程序本身时不起作用的任何原因吗?
  • 奇怪; /usr/local/bin 实际上在 OS X 的默认 PATH 中。我不确定 Py2app 究竟是如何产生的,但我想它可能设置了一个不同的(最小)PATH,然后以不运行的模式运行 shell '不使用 .bash_profile 初始化。我会尝试使用clustal 的完整路径,看看是否能解决它。如果是这样,可能有更好的选择,但我不确定它是什么。
  • @GordonDavisson,如果我使用完整路径调用clustal,冻结的应用程序可以正常工作。我将不得不更改我的脚本以获得clustal 的完整路径,然后执行它。感谢您的建议!您可以将其发布为我接受的答案,否则,我将在未来某个时间发布关于我如何解决它的描述

标签: python macos argument-passing exit-code py2app


【解决方案1】:

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

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

【讨论】:

  • 经过数小时的搜索,我在 Py2app 本身中找到了一个简洁的选项,它完全符合我的要求!
【解决方案2】:

引自 Py2app 0.6.4 次要功能版本:

问题 #15:py2app 现在可以选择通过在终端中打开一个窗口来模拟您获得的 shell 环境。

用法:python setup.py py2app --emulate-shell-environment

此选项是实验性的,远不能确定该实施是否适用于所有系统。

将此选项与 Py2app 一起使用解决了 Py2app 冻结的应用程序与 Os X shell 之间的通信阻塞问题。

【讨论】:

  • 最近发现这不是一个完整的解决方案。它当然可以在应用程序被冻结的 Mac 中工作,但是当我在另一台 Mac 上使用这个冻结的应用程序时,它无法建立与外壳的正确连接。但是,如果我通过终端打开这个冻结的应用程序而不是双击应用程序,一切都会正常工作。
猜你喜欢
  • 1970-01-01
  • 2015-05-20
  • 1970-01-01
  • 2015-06-08
  • 1970-01-01
  • 1970-01-01
  • 2010-09-29
  • 1970-01-01
  • 2015-03-13
相关资源
最近更新 更多