Путь к исполняемому файлу для Mac App - PullRequest
6 голосов
/ 27 ноября 2010

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

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

Edit1: разветвление - это ограниченная опция, которая может не работать с пакетом исполняемых файлов сторонних разработчиков с приложением + Мне нужно запустить это на Mac и Windows.
Edit2: Вопрос в том, как запустить связанный Python-скрипт с помощью модуля подпроцесса

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

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

  1. MainApp: пользовательский интерфейс
  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 не кроме аргументов.

Ответы [ 3 ]

1 голос
/ 02 декабря 2010

Как найти 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, что, я думаю, было бы вам интересно (?).

0 голосов
/ 29 ноября 2010

Я не смог заставить работать py2app, но исполняемый файл приложения находится в AppName.app/Contents/MacOS/AppName.Вы можете проверить в AppName.app/Contents/Info.plist файле ключ <key>CFBundleExecutable</key>, он указывает на исполняемый файл комплекта в папке AppName.app/Contents/MacOS.

Так что вы можете назвать его как AppName.app/Contents/MacOS/AppName --backgroundprocess.

Если выЧтобы BackgroundApp мог запустить фоновый процесс без каких-либо аргументов, есть две опции: a) создать пакет из скрипта Python, который запускает фоновый процесс без каких-либо аргументов;б) измените <key>CFBundleExecutable</key> в Info.plist файле на BackGroundApp_shell и создайте сценарий оболочки Contents/MacOS/BackgroundApp_shell следующего содержания:

#!/bin/sh

`dirname "$0"`/BackgroundApp --backgroundprocess

, предполагая, что исполняемый файл BackgroundApp.

0 голосов
/ 29 ноября 2010

Создайте одно приложение, затем просто вызовите --bakgroundproccess для приложения, а затем создайте ярлык для флага backgroundprocess. Или два разных файла приложения. Эфир это хороший способ

...