Исполняемый путь к приложению Mac
В пакете приложений py2app / Mac есть ли способ создать другой экземпляр того же приложения из приложения, передавая различные аргументы командной строки?
Или учитывая пакет приложений mac, как я могу запустить его из командной строки и передать некоторые аргументы?
Edit1: разветвление-это ограниченный вариант, который может не работать с 3-й партией исполняемых файлов bundle with app+мне нужно запустить это на mac и windows.
Edit2: Вопрос заключается в том, как запустить связанный скрипт python с помощью подпроцесса модуль
Подробности:
Я использую py2app для создания пакета приложений для моего приложения. Мое приложение состоит из двух частей
- MainApp: что такое UI
- BackgroundApp: фоновый процесс, который выполняет реальную работу
И MainApp, и BackgroundApp были реализованы как скрипт python, и на самом деле это один и тот же скрипт python с разными командными строками, например
python myapp.py
python myapp.py --backgroundprocess
Поэтому, когда я запускаю python myapp.py, он автоматически запускает фон процесс, основанный на пути к программе, но поскольку я теперь связал свое приложение как py2app, я не уверен, какой исполняемый файл я должен вызывать и передавать --backgroundprocess опцию?
Что я пробовал
$ open MyApp.app/это открывает приложение, но я не могу передать ему аргументы, так как они будут аргументами для команды open и не будут переданы в мое приложение
$ MyApp.app/Contents/MacOS/MyApp --backgroundprocessоткрывает приложение, но не процесс backgroun, поскольку кажется, что аргументы не передаются в приложение
И это выдает ошибку
Traceback (most recent call last):
File "/Users/agyey/projects/myapp/release4.26/py2exe/dist/MyApp.app/Contents/Resources/run.py", line 4, in <module>
from renderprocess import RenderEngineApp
File "renderprocess/RenderEngineApp.pyc", line 6, in <module>
File "wx/__init__.pyc", line 45, in <module>
File "wx/_core.pyc", line 4, in <module>
File "wx/_core_.pyc", line 18, in <module>
File "wx/_core_.pyc", line 11, in __load
ImportError: dlopen(/Users/agyey/projects/myapp/release4.26/py2exe/dist/MyApp.app/Contents/Resources/lib/python2.5/lib-dynload/wx/_core_.so, 2): Library not loaded: @executable_path/../Frameworks/libwx_macud-2.8.0.dylib
Referenced from: /Users/agyey/projects/myapp/release4.26/py2exe/dist/MyApp.app/Contents/Resources/lib/python2.5/lib-dynload/wx/_core_.so
Reason: Incompatible library version: _core_.so requires version 7.0.0 or later, but libwx_macud-2.8.0.dylib provides version 2.6.0
Вывод: похоже, что это невозможно.
запуск приложения в OS X с помощью командной строки
open ничего, кроме споров.
3 ответов:
Как найти cwd и выполнить произвольный двоичный файл Сначала поместите двоичный файл в AppName.app / Contents / Resources затем запустите этот код из скрипта python:
import subprocess process=subprocess.Popen((os.getcwd() + "/3rd_party_binary","--subprocess")) process.poll() # is running?Как правильно создать две версии вашего приложения python
Fork-это старый проверенный способ сделать это на MacOSX (unix)
#!/usr/bin/env python import os, sys pid = os.fork() if pid: # we are the parent background_process.start() os.waitpid(pid, 0) # make sure the child process gets cleaned up else: # we are the child gui_app.start() sys.exit(0) print "parent: got it; text =", txtМногопроцессорная обработка в Python - это, по-видимому, то, что работает и на windows, что, я думаю, было бы вам интересно(?).
Создайте одно приложение, затем просто вызовите --bakgroundprocess для приложения, а затем создайте ярлык для флага backgroundprocess. Или два разных файла приложения. Эфир-это хороший способ
Я не смог заставить py2app работать, но исполняемый файл приложения находится в
Таким образом, вы можете назвать его какAppName.app/Contents/MacOS/AppName. Вы можете проверить файлAppName.app/Contents/Info.plistна наличие ключа<key>CFBundleExecutable</key>, он указывает на исполняемый файл bundles в папкеAppName.app/Contents/MacOS.AppName.app/Contents/MacOS/AppName --backgroundprocess.Если вы хотите, чтобы
BackgroundAppзапускал фоновый процесс без каких-либо аргументов, Есть два варианта: а) сделать пакет из скрипта python, который запускает фоновый процесс без каких-либо аргументов; б) изменить<key>CFBundleExecutable</key>в файлеInfo.plist, чтобы сказатьBackGroundApp_shell, и сделать скрипт оболочкиContents/MacOS/BackgroundApp_shellследующего содержания:#!/bin/sh `dirname "$0"`/BackgroundApp --backgroundprocessПредполагая, что исполняемый файл является
BackgroundApp.
Comments