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

13

我有一个很好的针对OS X的Python应用程序,可以很好地运行。它运行一个外部终端脚本,并且我想将其包含在我的Python应用程序中。理想情况下,我希望能够运行py2app并将此脚本捆绑到可执行文件中,然后能够在我的代码的Python部分中包含并运行它。这是可能的吗?

提前感谢!

额外编辑:我使用的脚本是编译的。我不能只是查看并粘贴其中的内容。


“终端脚本”到底是什么?通常我会认为你指的是shell脚本,但你说它被编译了,所以那肯定不对。 - abarnert
抱歉,这是一个旧的 Mac Unix 可执行文件(PowerPC)。(脚本可能不是最好的词汇选择。) - Mizmor
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等方法添加任意相对路径的任意文件,这可能是更好的解决方案,但它更加复杂。

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

import Foundation
# ...
bundle = Foundation.NSBundle.mainBundle()
path = bundle.pathForResource_ofType_('foo', None)
您可以使用NSTask或子进程Popen、os.system等来启动它。

1
这对我来说运行得相当不错,除了Unix可执行文件被更改以至于无法被识别 - 但是我只需要在创建应用程序后自己添加它即可。现在它已经存在了,一旦与Mac上的其他应用程序一起安装,它就有了一个一致的文件路径。感谢您的帮助! - Mizmor
其实这很有道理;我不知道它使用install、cp还是ditto来复制资源,但无论它使用什么,它都不会保留权限,而是将它们设置为资源文件应该具有的权限。这也可能是为什么它说“不适用于代码!”我编辑了答案来提到这一点。无论如何,只要后续的py2app步骤对你可行,很高兴看到它能工作。 - abarnert

0

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

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

很不幸,我对编译Python文件并不是很熟悉,所以我不知道是否可能包含这样的文件。我认为你最好的选择是使用os.system()来运行你可能保存在应用程序相同目录下的脚本。 - ICoffeeConsumer
到目前为止,这就是我正在做的事情。我只是希望将所有内容捆绑在一起,以便为我的客户提供一个漂亮的可交付成果。 - Mizmor
这完全没有回答他的问题。他知道如何运行脚本,但他不知道如何将其捆绑到他的py2app捆绑包中,因此告诉他如何运行脚本并没有什么帮助。 - abarnert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接