13

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

提前致谢!

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

4

2 回答 2

10

请参阅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 或 subprocess、Popen、os.system 等启动它。

于 2012-07-07T00:14:44.263 回答
0

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

import os
script = " a big long bash script "
os.system(script);
于 2012-07-06T21:51:41.710 回答