Mac App的可执行路径

时间:2010-11-27 13:33:30

标签: python macos py2app

在py2app / Mac应用程序包中,有没有办法通过传递不同的命令行参数从应用程序中生成同一个应用程序的另一个实例?

或者给出一个mac app bundle,如何从命令行运行它并传递一些参数呢?

Edit1:forking是一个有限的选项,可能不适用于第三方可执行文件捆绑app +我需要在mac和windows上运行它。
Edit2:问题是如何使用子进程模块运行捆绑的python脚本

详细说明:

我正在使用py2app为我的appilcation生成一个应用程序包。我的申请分为两部分

  1. MainApp:哪个是UI
  2. BackgroundApp:后台进程,完成实际工作
  3. 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打开应用但不打开后台处理过程,因为它似乎没有将参数传递给应用

    3. 也会抛出错误

        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
      

      结论:看起来可能无法实现 Launch an app on OS X with command line

      open除了参数外没有。

3 个答案:

答案 0 :(得分:1)

如何找到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

Multiprocessing in Python显然也适用于Windows,我觉得这对你很有意思(?)。

答案 1 :(得分:0)

创建一个应用程序然后只需为应用程序调用--bakgroundproccess,然后为backgroundprocess标志创建一个快捷方式。或者两个不同的app文件。以太是一种好方法

答案 2 :(得分:0)

我无法使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脚本生成bundle,它运行后台进程而不带任何参数; b)将<key>CFBundleExecutable</key>文件中的Info.plist更改为BackGroundApp_shell,并制作以下​​内容的shell脚本Contents/MacOS/BackgroundApp_shell

#!/bin/sh

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

假设可执行文件为BackgroundApp