【问题标题】:Can executables made with py2app include other terminal scripts and run them?使用 py2app 制作的可执行文件可以包含其他终端脚本并运行它们吗?
【发布时间】:2012-07-07 08:57:49
【问题描述】:

所以我有一个运行良好的 OS X 的 Python 应用程序。它运行一个外部终端脚本,我想将它包含在我的 python 应用程序中。理想情况下,我能够运行 py2app 并将这个脚本与它捆绑到可执行文件中,然后能够包含它并在我的代码的 python 部分中运行它。这可能吗?

提前致谢!

额外编辑:我正在使用的脚本已编译。我不能只看里面并粘贴它。

【问题讨论】:

  • 究竟什么是“终端脚本”?通常我会假设你的意思是一个 shell 脚本,但你说它是编译的,所以这是不对的。
  • 抱歉,这是一个旧的 Mac Unix 可执行文件 (PowerPC)。 (脚本可能不是最好的词。)

标签: python macos py2app


【解决方案1】:

查看http://svn.pythonmac.org/py2app/py2app/trunk/doc/index.html#option-reference 并查看 --resources 参数。例如:

python setup.py py2app --resources foo

如果这是一个 shell 脚本,那将是一件非常有效的事情。对于二进制可执行文件,它有点 hacky。首先,p2app 的文档清楚地写着“不是代码!”。其次,OS X 文档说不要将可执行文件放在 Resources 目录中。这样做的主要原因是代码签名:默认设置“密封”资源中的所有内容作为主应用程序签名的一部分,但单独的可执行文件不应该以这种方式密封,它们应该单独签名。

但是,尽管如此,它仍然可以工作。除了它可能不会以 +x 权限结束,所以在您的 py2app 步骤之后,您必须“chmod +x MyApp.app/Contents/Resources/foo”以使其可运行。

您还可以使用 distutils package_data、data_files 和/或 MANIFEST 内容添加具有任意相对路径的任意文件,这可能是一个更好的解决方案,但它更复杂。

无论哪种方式,在您的脚本中,您都应该使用与包相关的路径,您可以通过 PyObjC 轻松访问该路径。鉴于您使用的是 PowerPC 可执行文件,您可能需要如此多的向后兼容性,以至于您不能依赖它,在这种情况下,您可能只需要使用“../Resources/foo”,否则,它看起来像这样:

import Foundation
# ...
bundle = Foundation.NSBundle.mainBundle()
path = bundle.pathForResource_ofType_('foo', None)

然后您可以使用 NSTask 或子进程、Popen、os.system 等启动它。

【讨论】:

  • 这对我来说效果很好,只是更改了 unix 可执行文件,使其无法被识别为可执行文件——但我需要做的就是在创建应用程序后将其添加到自己中。现在它就在那里,一旦它与 Mac 上的其他应用程序一起安装,它就有一个一致的文件路径。感谢您的帮助!
  • 其实,这是有道理的;我不知道它是使用 install、cp 还是 ditto 来复制资源,但不管它做什么,它大概都不会保留权限,而是将它们设置为资源文件应有的权限。这可能是它说“不是为了代码!”的部分原因。编辑了答案以提及这一点。无论如何,只要你可以接受 post-py2app 步骤,很高兴看到它有效。
【解决方案2】:

您始终可以包含 os 模块并调用os.system(script);。它在终端/命令行中执行给定的参数。例如:

import os
script = " a big long bash script "
os.system(script);

【讨论】:

  • 不幸的是,我对编译 Python 文件不是很熟悉,所以我什至不知道是否可以包含这样的文件。我认为您最好的选择是使用 os.system() 来运行您可能与应用程序保存在同一目录中的脚本。
  • 到目前为止,这就是我正在做的事情。我只是希望将所有内容捆绑在一起,以便为我的客户提供一个很好的可交付成果。
  • 这根本没有回答他的问题。他知道如何运行脚本,但不知道如何将其与他的 py2app 捆绑包捆绑在一起,因此告诉他如何运行脚本并没有太大帮助。
猜你喜欢
  • 1970-01-01
  • 2012-08-04
  • 2013-07-25
  • 1970-01-01
  • 2013-08-26
  • 2017-07-04
  • 2023-03-22
  • 1970-01-01
  • 2017-01-04
相关资源
最近更新 更多