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

Python 使用py2app生成的可执行文件是否可以包含其他终端脚本并运行它们?,python,macos,py2app,Python,Macos,Py2app,因此,我有一个很好的用于OSX的python应用程序,它工作得很好。它运行一个外部终端脚本,我想将其包含在我的python应用程序中。理想情况下,我能够运行py2app并将此脚本捆绑到可执行文件中,然后能够将其包含在代码的python部分中并运行它。这可能吗 提前谢谢 额外编辑:我正在使用的脚本已编译。我不能只是往里面看然后贴上去 您可以始终包含os模块并调用os.system(脚本)。它在终端/命令行中执行给定的参数。例如: import os script = " a big long ba

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

提前谢谢


额外编辑:我正在使用的脚本已编译。我不能只是往里面看然后贴上去

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

import os
script = " a big long bash script "
os.system(script);
python setup.py py2app --resources foo
请参阅并查看--resources参数。例如:

import os
script = " a big long bash script "
os.system(script);
python setup.py py2app --resources foo
如果这是一个shell脚本,那么这将是一个非常有效的方法。对于二进制可执行文件,它有点黑客。首先,p2app的文档清楚地表明“不适用于代码!”。其次,OSX文档说明不要将可执行文件放在Resources目录中。这样做的主要原因是代码签名:默认设置“密封”资源中的所有内容,作为主应用程序签名的一部分,但是单独的可执行文件不应该这样密封,它们应该单独签名

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

您还可以使用distutils包、数据文件和/或清单来添加具有任意相对路径的任意文件,这可能是更好的解决方案,但更复杂

无论哪种方式,在脚本中,都应该使用与包相关的路径,您可以通过PyObjC轻松访问该路径。考虑到您使用的是PowerPC可执行文件,您可能需要非常多的向后兼容性,因此无法依赖于此,在这种情况下,您可能只需要“./Resources/foo”就可以了,但除此之外,它看起来是这样的:

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

然后,您可以使用NSTask或subprocess、Popen、os.system等启动它。

不幸的是,我不太熟悉Python文件的编译,所以我不知道是否可以包含这样的文件。我认为您最好的选择是使用os.system()来运行脚本,您可以将脚本保存在与应用程序相同的目录中。到目前为止,这就是我正在做的。我只是希望把这些都打包起来,为我的客户创造一个好的交付物。这根本不能回答他的问题。他知道如何运行脚本,但他不知道如何将其与py2app捆绑包捆绑在一起,因此告诉他如何运行脚本并没有多大帮助。到底什么是“终端脚本”?通常我会假设你指的是一个shell脚本,但你说它是编译的,所以这是不对的。对不起,这是一个旧的Mac Unix可执行文件(PowerPC)。(脚本可能不是最好用的词。)这对我来说效果相当不错,只是unix可执行文件被更改了,因此无法识别为可执行文件——但我所需要做的就是在创建应用程序后将其添加到我自己的程序中。现在它就在那个里,一旦它和其他应用程序一起安装在Mac上,它就有了一个一致的文件路径。谢谢你的帮助!事实上,这是有道理的;我不知道它是使用install、cp还是同上来复制资源,但不管它做什么,它大概都不会保留特权,而是将它们设置为资源文件应该具有的权限。这可能是为什么它说“不是为了代码!”的一部分,编辑了答案来提到这一点。无论如何,只要py2app后的步骤对您来说是可以接受的,很高兴看到它能够工作。