使用py2app制作的可执行文件是否包含其他终端脚本并运行它们?

时间:2012-07-06 21:40:49

标签: python macos py2app

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

提前致谢!

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

2 个答案:

答案 0 :(得分:9)

请参阅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来添加任意相对路径的任意文件,这可能是一个更好的解决方案,但它更复杂。

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

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

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

答案 1 :(得分:0)

您可以随时添加 os 模块并致电os.system(script);。它在终端/命令行中执行给定的参数。例如:

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