Исполняемый путь к приложению Mac



В пакете приложений py2app / Mac есть ли способ создать другой экземпляр того же приложения из приложения, передавая различные аргументы командной строки?



Или учитывая пакет приложений mac, как я могу запустить его из командной строки и передать некоторые аргументы?



Edit1: разветвление-это ограниченный вариант, который может не работать с 3-й партией исполняемых файлов bundle with app+мне нужно запустить это на mac и windows.

Edit2: Вопрос заключается в том, как запустить связанный скрипт python с помощью подпроцесса модуль



Подробности:



Я использую py2app для создания пакета приложений для моего приложения. Мое приложение состоит из двух частей




  1. MainApp: что такое UI

  2. BackgroundApp: фоновый процесс, который выполняет реальную работу


И MainApp, и BackgroundApp были реализованы как скрипт python, и на самом деле это один и тот же скрипт python с разными командными строками, например



python myapp.py
python myapp.py --backgroundprocess


Поэтому, когда я запускаю python myapp.py, он автоматически запускает фон процесс, основанный на пути к программе, но поскольку я теперь связал свое приложение как py2app, я не уверен, какой исполняемый файл я должен вызывать и передавать --backgroundprocess опцию?



Что я пробовал





  1. $ open MyApp.app/ это открывает приложение, но я не могу передать ему аргументы, так как они будут аргументами для команды open и не будут переданы в мое приложение



  2. $ 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 ничего, кроме споров.

761   3  

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

    Ничего не найдено.