Подтвердить что ты не робот

Могут ли исполняемые файлы, созданные с помощью py2app, включать другие терминальные сценарии и запускать их?

Итак, у меня есть хорошее приложение python для OS X, которое отлично работает. Он запускает внешний терминал script, и я хотел бы включить его в мое приложение python. В идеале я мог бы запустить py2app и связать его с script с ним в исполняемом файле, а затем включить его и запустить в части моего кода python. Это возможно?

Спасибо заранее!

Extra Edit: script, который я использую, скомпилирован. Я не могу просто заглянуть внутрь и вставить его.

4b9b3361

Ответ 1

Смотрите http://svn.pythonmac.org/py2app/py2app/trunk/doc/index.html#option-reference и посмотрите на параметр --resources. Например:

python setup.py py2app --resources foo

Если это была оболочка script, это было бы совершенно правильной вещью. Для двоичного исполняемого файла это немного более взломанно. Во-первых, в документации p2app четко сказано "не для кода!". Во-вторых, в документации по OS X говорится, что нельзя загружать исполняемые файлы в каталог ресурсов. Основной причиной этого является подписание кода: настройки по умолчанию "запечатывают" все в Ресурсах как часть основной подписи приложения, но отдельные исполняемые файлы не должны быть запечатаны таким образом, они должны быть подписаны отдельно.

Однако, все, что сказано, оно все равно будет работать. За исключением того, что он, вероятно, не получит разрешения + x, поэтому после шага py2app вам нужно будет "chmod + x MyApp.app/Contents/Resources/foo", чтобы сделать его выполнимым.

Вы также можете использовать файлы distutils package_data, data_files и/или MANIFEST для добавления произвольных файлов с произвольными относительными путями, что может быть лучшим решением, но это сложнее.

В любом случае, в script, вы должны использовать связанный с пакетом путь, к которому вы можете легко получить доступ через PyObjC. Учитывая, что вы используете исполняемый файл PowerPC, вам может потребоваться такая обратная совместимость, на которую вы не можете положиться, и в этом случае вам может потребоваться просто "../Resources/foo", но в противном случае это выглядит следующим образом:

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

Затем вы можете запустить его с помощью NSTask или подпроцесса, Popen, os.system и т.д.

Ответ 2

Вы всегда можете включить модуль os и вызвать os.system(script);. Он выполняет данный аргумент в терминале/командной строке. Например:

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